轻量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 )
1 public class todo 2 { 3 [nondatabasefield] 4 public string remark { get; set; } 5 6 [sqlrepodbfield] 7 public datetime createddate { get; set; } 8 9 [sqlrepodbfield] 10 public bool iscompleted { get; set; } 11 12 [sqlrepodbfield] 13 public string task { get; set; } 14 15 [identityfield] 16 public int id { get; set; } 17 }
类型代码(不指定 使用 simplewritablepropertymatcher)
1 public class todo 2 { 3 [nondatabasefield] 4 public string remark { get; set; } 5 public datetime createddate { get; set; } 6 public bool iscompleted { get; set; } 7 public string task { get; set; } 8 9 [identityfield] 10 public int id { get; set; } 11 }
(二)事务支持
1、在初始仓储时如果使用
mssqlrepofactory.usestatementtransactionexecutor();
2、代码中使用使用方法 repository.getconnectionprovider.begintransaction() 获取事务控制
1 public void doit2() 2 { 3 var repository = mysqlrepofactory.create<todo>(); 4 using (var tranc = repository.getconnectionprovider.begintransaction()) 5 { 6 repository.update().set(c => c.task, "a31").where(c => c.id == 1).go();// a1 7 repository.update().set(c => c.task, "b31").where(c => c.id == 2).go();// b2 8 9 tranc.rollback(); 10 } 11 }
(三)、增加生成 @ 参数 的语句支持
返回形如下列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 public static void testmysqlupdate() 2 { 3 string connectionstring = "datasource=127.0.0.1;username=test;password=test;database=sqlrepotest;charset=gb2312;sslmode = none;"; 4 var connectionprovider = new mysqlp.connectionstringconnectionprovider(connectionstring); 5 mysqlrepofactory.useconnectionprovider(connectionprovider); 6 mysqlrepofactory.usestatementexecutor(new dapperstatementexecutor(connectionprovider)); 7 mysqlrepofactory.usedatareaderentitymapper(new dapperentitymapper()); 8 mysqlrepofactory.usewritablepropertymatcher(new simplewritablepropertymatcher()); 9 var repository11 = mysqlrepofactory.create<todo>(); 10 var results11 = repository11.query().where(c => c.id == 2).go().firstordefault(); 11 12 results11.task = "b21"; 13 14 var rest2= repository11.update().for(results11); 15 16 console.writeline(rest2.paramsql()); 17 18 var rest3 = rest2.paramsqlwithentity(); 19 20 idbconnection dbconnection = repository11.getconnectionprovider.getdbconnection; 21 22 dbconnection.execute(rest3.paramsql, rest3.entity); 23 }
二、注意事项
1、如果返回的sql中没有字段名返回,如 insert doto() values() ,这种情况,当前使用了writablepropertymatcher 属性读写器,而dto类又未设置特性
你可以
(1)、增加相应字段特性
1 [sqlrepodbfield] 2 public string task { get; set; } 3 4 [identityfield] 5 public int id { get; set; }
(2)、使用 simplewritablepropertymatcher属性读写器
mssqlrepofactory.usewritablepropertymatcher(new simplewritablepropertymatcher());
2、事务支持,事务支持需使用mssqlrepofactory.usestatementtransactionexecutor();,如果是自定义的读写器,一定不在内部关闭 connection;
下一篇: XML序列化