輕量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;