zoukankan      html  css  js  c++  java
  • 轻型的ORM类Dapper

    Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll。官方站点http://code.google.com/p/dapper-dot-net/ ,也可以通过Nuget进行安装

    image

    • Dapper很快。Dapper的速度接近与IDataReader。
    • Dapper支持主流数据库 Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库
    • 支持多表并联的对象。支持一对多 多对多的关系,并且没侵入性。
    • 原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
    • Dapper语法十分简单。并且无须迁就数据库的设计 

    Query()方法:
            Query()是IDbConnection扩展方法并且重载了,从数据库里提取信息,并用来填充我们的业务对象模型。

    • var counters = new List<Tuple<int, PerformanceCounter>>(); 
                      using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString)) 
                      { 
                          conn.Open(); 
                          string sql = string.Format("select Id,ServiceName,CategoryName,CounterName,InstanceName from service_counters where MachineName='{0}'",machineName); 
                          foreach (var counter in conn.Query<ServiceCounter>(sql)) 
                          { 
                              logger.InfoFormat(@"Creating performance counter: {0}{1}{2}{3}", counter.MachineName ?? ".", counter.CategoryName, 
                                                  counter.CounterName, counter.InstanceName); 
                              var perfCounter = new PerformanceCounter(counter.CategoryName, counter.CounterName, counter.InstanceName, counter.MachineName ?? "."); 
                              counters.Add(new Tuple<int, PerformanceCounter>(counter.Id, perfCounter)); 
                              // first value doesn't matter so we should call the counter at least once 
                              try { perfCounter.NextValue(); } 
                              catch { } 
                          } 
                      }

      下面是ServiceCounter的定义

      public class ServiceCounter 
      { 
          public int Id { get; set; }
      
          public String ServiceName { get; set; }
      
          public String MachineName { get; set; } 
          public String CategoryName { get; set; } 
          public String CounterName { get; set; } 
          public String InstanceName { get; set; }
      
          public String DisplayName { get; set; } 
          
          public String DisplayType { get; set; }
      
          public override String ToString() 
          { 
              return String.Format(@"{0}{1}{2}{3}", MachineName ?? ".", CategoryName, CounterName, InstanceName); 
          } 
      }

      Dapper也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象。

      1,在填充嵌套对象的时候,只好执行ToList<>方法,否则回报ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭,而单个对象不会报错,估计是using结束后关闭了连接,而嵌套对象在map的时候又执行了ExecuteReader,只好在using结束之前返回list集合。 
      2,嵌套对象的参数是比较多的,主要是前两个参数,其它参数没用可以设置为null。特别要注意的是splitOn,这个参数不能为空,否则会报对象为引用的错误。【splitOn参数的意思是读取第二个对象的的分割列,从哪个列起开始读取第二个对象,如果表里的自增长列都为Id,可以设置这个参数为”Id”】.

      Execute方法: 
      正如Query方法是检索数据的,Execute方法不会检索数据,它与Query方法非常相似,但它总返回总数(受影响的行数),而不是一个对象集合【如:insert update和delete】.

      private void SaveServiceSnapshots(IEnumerable<ServiceCounterSnapshot> snapshots) 
              { 
                  using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString)) 
                  { 
                      conn.Open(); 
                      foreach (var snapshot in snapshots) 
                      { 
                          // insert new snapshot to the database 
                         conn.Execute( 
          @"insert into service_counter_snapshots(ServiceCounterId,SnapshotMachineName,CreationTimeUtc,ServiceCounterValue) values ( 
              @ServiceCounterId,@SnapshotMachineName,@CreationTimeUtc,@ServiceCounterValue)", snapshot); 
                      }
      
                  } 
              }

      ServiceCounterSnapshot的定义如下:

      public class ServiceCounterSnapshot 
      { 
          public int Id { get; set; }
      
          public int ServiceCounterId { get; set; }
      
          /// <summary> 
          /// Machine on which the snapshot was taken. 
          /// </summary> 
          public String SnapshotMachineName { get; set; }
      
          public DateTime CreationTimeUtc { get; set; }
      
          public float? ServiceCounterValue { get; set; } 
      }
  • 相关阅读:
    Cloud7为全球移动互联网大会提供手机门户支撑 开源CMS
    揭东县信息中心采用We7站群管理系统重新架构揭东县政务网 开源CMS
    中国计算机报:We7云计算重塑政府门户网站群 开源CMS
    We7网站群系统全新打造辽宁省民政厅网站群平台 开源CMS
    We7网站群为华中科技大学同济医学院附属同济医院提供专业网... 开源CMS
    sso实现原理解析
    TDSQL | DB·洞见回顾|基于LSMTree存储的数据库性能改进
    又拿奖了!腾讯云原生数据库TDSQLC斩获2021PostgreSQL中国最佳数据库产品奖
    为云而生,云原生数据库TDSQLC技术突破与演进
    金融级数据库新坐标:腾讯云TDSQL发布全自研新敏态引擎
  • 原文地址:https://www.cnblogs.com/bosamvs/p/6053914.html
Copyright © 2011-2022 走看看