您的位置:首页 > 其它

Restful.Data v2.0发布,谢谢你们的支持和鼓励

2014-05-22 17:46 465 查看
v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力。

v2.0在除了细枝末节外,在功能上主要做了一下更新:

1、实体类不再需要自己跟踪属性值变化:

[Serializable]
public class Person
{
[PrimaryKey, AutoIncrease]
public virtual int Id { get; set; }

public virtual string Name { get; set; }

public virtual int? Age { get; set; }

public virtual decimal? Money { get; set; }

public virtual DateTime CreateTime { get; set; }

public virtual bool IsActive { get; set; }
}


属性需要限定为 virtual ,以便生成代理。

如何新增数据:

[Test()]
public void Insert()
{
// 新增时,对象务必使用 EntityProxyGenerator 创建实体代理,否则无法跟踪属性变化
var person = EntityProxyGenerator.CreateProxy<Person>();

person.Name = "test";
//person.Age = 20;
person.Money = 100;
person.CreateTime = DateTime.Now;
person.IsActive = false;

using (ISession session = SessionFactory.CreateDefaultSession())
{
int i = session.Insert(person);

// 输出生成的SQL语句
Console.WriteLine(SqlCmd.Current.Sql);

int id = session.GetIndentifer<int>();

Assert.AreEqual(1, i);
Assert.Greater(id, 0);
}
}


如何更新数据:

[Test()]
public void Update()
{
var person = EntityProxyGenerator.CreateProxy<Person>();

person.Name = "test";
person.Age = 20;
person.Money = 100;
person.CreateTime = DateTime.Now;
person.IsActive = true;

using (ISession session = SessionFactory.CreateDefaultSession())
{
int i = session.Insert(person);

int id = session.GetIndentifer<int>();

// Find 方法返回的对象都是原始对象而非代理对象
person = session.Find<Person>().Where(s => s.Id == id).Single();

Console.WriteLine(SqlCmd.Current.Sql);

// 根据原始对象创建代理对象
person = person.ToEntityProxy<Person>();

person.Name = "test01";
person.Age = 31;
person.Money = 200;

i = session.Update(person);

Console.WriteLine(SqlCmd.Current.Sql);

person = session.Find<Person>().Where(s => s.Id == id).Single();

Console.WriteLine(SqlCmd.Current.Sql);

Assert.AreEqual(1, i);
Assert.AreEqual("test01", person.Name);
Assert.AreEqual(31, person.Age.Value);
Assert.AreEqual(200, person.Money.Value);

person = EntityProxyGenerator.CreateProxy<Person>();

person.Name = "test";
person.Age = 20;
person.Money = 100;
person.CreateTime = DateTime.Now;
person.IsActive = true;

i = session.Update<Person>().Set(person).Where(s => s.Id == id).Execute();

Console.WriteLine(SqlCmd.Current.Sql);

Assert.AreEqual(1, i);
Assert.AreEqual("test", person.Name);
Assert.AreEqual(20, person.Age.Value);
Assert.AreEqual(100, person.Money.Value);
Assert.AreEqual(true, person.IsActive);
}
}


2、SQL语句中的参数:

你可以这样写:

using (ISession session = SessionFactory.CreateDefaultSession())
{
string sql = "select count(*) from Person where Id = ? and CreateTime < ?";

int count = session.ExecuteScalar<int>(sql, 500, DateTime.Now);

Assert.AreEqual(1, count);
}


在任何数据库环境下,所有参数均使用问号替代参数名,但需保证问号的数量与传入的参数值数量一致,并顺序一致。

如何需要进行条件拼接,可以这样写:

StringBuilder builder = new StringBuilder();

builder.Append("select * from Person where ");

IList<object> parameters = new List<object>();

if (model.Id != 0)
{
builder.Append("Id = ?, ");
parameters.Add(model.Id);
}

if (string.IsNullOrEmpty(model.Name) == false)
{
builder.Append("Name = ?, ");
parameters.Add(model.Name);
}

return session.ExecuteDataTable(builder.ToString(), parameters);


OK,就介绍这两点,其他功能请自己摸索。

后期将陆续发布oracle与sqlserver的provider,功能上将不再做大的更新和变动。

如有不明白的,请参见我的上两篇帖子。

我马上也要专心去找工作养家糊口了,在家呆了快一个月了,各位博友有好的工作机会帮忙推荐一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: