1. 程式人生 > >輕量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新說明

輕量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新說明

一、功能變化

(一)、強化特性支援

1、部分型別擁有複雜屬性;

2、有些屬性不是來源於資料庫

3、使用者在原來的程式碼中使用 SqlRepoEx ,減少欄位與資料庫欄位之間的衝突;

4、為支援新的特性及優化屬性讀寫,增加了 SimpleWritablePropertyMatcher;

5、增加SqlRepoDbFieldAttribute特性後,如果使用者程式仍然為POJO型別,不必標識SqlRepoDbFieldAttribute時,用SimpleWritablePropertyMatcher

6、如果明確要區分,就用WritablePropertyMatcher ;

 string ConnectionString = "Data Source=(Local);Initial Catalog=Northwind;User ID=test;Password=test";

          var connectionProvider = new ConnectionStringConnectionProvider(ConnectionString);

           MsSqlRepoFactory.UseConnectionProvider(connectionProvider);

   // 使用新的屬性讀寫器

           MsSqlRepoFactory.UseWritablePropertyMatcher(new SimpleWritablePropertyMatcher());

           var repository = MsSqlRepoFactory.Create<Customers>();

 型別程式碼(使用明確特定  使用 WritablePropertyMatcher )

    public class ToDo
    {
        [NonDatabaseField]
        public string Remark { get; set; }

        [SqlRepoDbField]
        public DateTime CreatedDate { get; set; }

        [SqlRepoDbField]
        public bool IsCompleted { get; set; }

        [SqlRepoDbField]
        public string Task { get; set; }

        [IdentityField]
        public int Id { get; set; }
    }

 型別程式碼(不指定 使用 SimpleWritablePropertyMatcher)

public class ToDo
    {
        [NonDatabaseField]
        public string Remark { get; set; }
        public DateTime CreatedDate { get; set; }
        public bool IsCompleted { get; set; }
        public string Task { get; set; }
        [IdentityField]
        public int Id { get; set; }
    }

(二)事務支援

 1、在初始倉儲時如果使用

MsSqlRepoFactory.UseStatementTransactionExecutor();

2、程式碼中使用使用方法 repository.GetConnectionProvider.BeginTransaction() 獲取事務控制

public void DoTransactionIt()
        {
            var repository = MsSqlRepoFactory.Create<ToDo>();
            var results = repository.Query().Where(c => c.Id < 6);
           foreach (var item in results.Go())
            {
                Console.WriteLine($"{item.Id}\t {item.Task} ");
            }
            using (var tranc = repository.GetConnectionProvider.BeginTransaction())
            {
                repository.Update().Set(c => c.Task, "A01").Where(c => c.Id == 1).Go();// A1
                repository.Update().Set(c => c.Task, "B01").Where(c => c.Id == 2).Go();// B2
                tranc.Rollback();
            }
           foreach (var item in results.Go())
            {
                Console.WriteLine($"{item.Id}\t {item.Task} ");
            }
            Console.WriteLine(results.Sql());
          }

(三)、增加生成  @ 引數 的語句支援

返回形如下列SQL語句:

var repository = MsSqlRepoFactory.Create<ToDo>();

var results = repository.Query().Where(c => c.Id == 6).Go().FirstOrDefault();

Console.WriteLine(resultinsert.ParamSql());

1、 INSERT  ToDo ( CreatedDate , IsCompleted , Task )

VALUES(@CreatedDate,@IsCompleted,@Task);

var resultinsert = repository.Update().For(results);

 Console.WriteLine(resultinsert.ParamSql());

2、 UPDATE   ToDo

SET CreatedDate  = @CreatedDate, IsCompleted  = @IsCompleted, Task  = @Task

WHERE Id  = @Id;

以解決儲如Dapper等ORM工具需要引數型別字串需求

SqlRepoEx中是可以與 Dapper 同時並存,意味著初始化SqlRepoEx後,

1、可以直接從 SqlRepoEx 中操作返回結果;

2、可以通過 SqlRepoEx 來生成SQL語句,另外Dapper 主要是基於SqlMapper ,SqlMapper中定義了基於 IDbConnection 介面的操作,你可以通過SqlRepoEx 的 IConnectionProvider 介面來獲取一個 DbConnection 有兩種方法

     (1)、 var connectionProvider = new AppConfigFirstConnectionProvider();

           IDbConnection dbConnection = connectionProvider.GetDbConnection;

     (2)、 var repository = MsSqlRepoFactory.Create<ToDo>();

          IDbConnection dbConnection = repository.GetConnectionProvider.GetDbConnection;

二、注意事項

1、如果返回的SQL中沒有欄位名返回,如  insert Doto() values()  ,這種情況,當前使用了WritablePropertyMatcher 屬性讀寫器,而DTO類又未設定特性

 你可以

 (1)、增加相應欄位特性

        [SqlRepoDbField]
        public bool IsCompleted { get; set; }

        [SqlRepoDbField]
        public string Task { get; set; }

 (2)、使用 SimpleWritablePropertyMatcher屬性讀寫器

        MsSqlRepoFactory.UseWritablePropertyMatcher(new SimpleWritablePropertyMatcher());

 var connectionProvider = new AppConfigFirstConnectionProvider();
            IDbConnection dbConnection = connectionProvider.GetDbConnection;
            MsSqlRepoFactory.UseConnectionProvider(connectionProvider);
            MsSqlRepoFactory.UseWritablePropertyMatcher(new WritablePropertyMatcher());
            MsSqlRepoFactory.UseStatementTransactionExecutor();

2、事務支援,事務支援需使用MsSqlRepoFactory.UseStatementTransactionExecutor();,如果是自定義的讀寫器,一定不在內部關閉 connection;

 

完整的演示程式碼見:https://gitee.com/azthinker/SqlRepoEx2.0Demo