zoukankan      html  css  js  c++  java
  • Dapper.Net 轻量级的ORM 框架2

    Dapper是一个轻型的ORM类 它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件,一个单文件就可以了。

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


    现在已经取代了原来的SqlHelper优

    点:

    • 使用Dapper可以自动进行对象映射!
    • 轻量级,单文件。
    • 支持多数据库。
    • Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
    • 由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。所以在使用前先实例化一个IDBConnection对象。所以调用之前,一定先加上命名空间:using Dapper;
    • Nuget查询Dapper,点击安装即可引入第三方DLL
    • Dapper很快。Dapper的速度接近与IDataReader。
    • Dapper支持主流数据库 Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库
    • 支持多表并联的对象。支持一对多 多对多的关系,并且没侵入性。
    • 原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
    • Dapper语法十分简单。并且无须迁就数据库的设计

    项目结构:

    image

    考虑到开发效率原来用的 Nhibernate  没有移除,Dapper同时使用。

    创建DAL.Dapper:

    image

    添加Dapper 引用(第一个就是):

    image

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

  • 相关阅读:
    FTP协议操作
    [转贴]SQL2005数据类型
    传智博客学习0512
    20120515传智学习
    20120516分析三层中的null的处理
    20120520晚
    你懂不懂我不知道,反正我是晕了
    20120509小记
    javascript 循环语句 while、dowhile、forin、for用法区别
    C#的一些学习方法
  • 原文地址:https://www.cnblogs.com/zhuimengzhe/p/6546555.html
Copyright © 2011-2022 走看看