欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-08-09 18:05:29
一、功能变化 (一)、强化特性支持 1、部分类型拥有复杂属性; 2、有些属性不是来源于数据库 3、用户在原来的代码中使用 SqlRepoEx ,减少字段与数据库字段之间的冲突; 4、为支持新的特性及优化属性读写,增加了 SimpleWritablePropertyMatcher; 5、增加SqlRe ......

一、功能变化

(一)、强化特性支持

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 )

轻量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新说明
 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     }
view code

 

 类型代码(不指定 使用 simplewritablepropertymatcher)

轻量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新说明
 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     }
view code

 

(二)事务支持

 1、在初始仓储时如果使用

mssqlrepofactory.usestatementtransactionexecutor();

2、代码中使用使用方法 repository.getconnectionprovider.begintransaction() 获取事务控制

轻量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新说明
 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          }
view code

 

(三)、增加生成  @ 参数 的语句支持

返回形如下列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;

轻量ORM-SqlRepoEx (十二)SqlRepoEx 2.0.1 至 2.2.0 版本更新说明
 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         }
view code

 

二、注意事项

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;

 

完整的演示代码见:https://gitee.com/azthinker/sqlrepoex2.0demo