zoukankan      html  css  js  c++  java
  • 轻量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     }
    View Code

     类型代码(不指定 使用 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     }
    View Code

    (二)事务支持

     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          }
    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;

     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

  • 相关阅读:
    docker
    perl有用的字符串匹配
    nginx 反向代理 kuberntes service 出现 502 问题排查
    应用应用容器化部署最佳实践
    监控系统设计
    kubernetes events 事件机制源码分析
    golang gc 原理和内存分配
    golang 使用 websocket 实现后台消息分组推送
    kubeadm 创建的 k8s 集群的升级
    在 kubernetes pod 中构建 docker image
  • 原文地址:https://www.cnblogs.com/athinker/p/9805395.html
Copyright © 2011-2022 走看看