1. 程式人生 > >Restful.Data v2.0釋出,謝謝你們的支援和鼓勵

Restful.Data v2.0釋出,謝謝你們的支援和鼓勵

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,功能上將不再做大的更新和變動。

如有不明白的,請參見我的上兩篇帖子。

我馬上也要專心去找工作養家餬口了,在家呆了快一個月了,各位博友有好的工作機會幫忙推薦一下。