Restful.Data v2.0釋出,謝謝你們的支援和鼓勵
阿新 • • 發佈:2018-12-27
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 voidInsert() { // 新增時,物件務必使用 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,功能上將不再做大的更新和變動。
如有不明白的,請參見我的上兩篇帖子。
我馬上也要專心去找工作養家餬口了,在家呆了快一個月了,各位博友有好的工作機會幫忙推薦一下。