zoukankan      html  css  js  c++  java
  • 使用Dapper.Contrib进行增删改查

    简介

    Dapper是介于Entity framework与ADO的折中选择。既满足手写查询的高性能需求,又简化了数据库对象映射为内存对象的繁杂工作。Dapper.Contrib是对Dapper的进一步封装,使对象的基本增删改查等操作进一步简化。

    为什么使用Dapper.Contrib

    如果仅仅使用Dapper,要对一个对象进行insert操作需要如下操作

     using (var connection = new SqlConnection("链接字符串"))
    {
           var users = connection.Execute("insert into Demo (Name,Age) values('张三',23)");
    }

    Dapper.Contrib不需要写sql,操作对象即可

    复制代码
    using (var connnection = DbHelper.GetConnection())
    {
          var result = connnection.Insert(new Demo
           {
                Age = 23,
                Name = "张三",
           });
    }
    复制代码

     使用Dapper.Contrib

    工欲善其事,必先利其器。要想不写sql愉快地增删改当然需要前期地配置。

    entity配置

    复制代码
        [Table("Demo")]
        public class Demo
        {
            [Key] //不是自动增长主键时使用ExplicitKey
            public int Id { get; set; }
    
            public string Name { get; set; }
    
            public int Age { get; set; }
    
            [Computed]
            public int ComputedAge => Age * 2;
    
            [Write(false)]
            public int NoWriteCol { get; set; }
    
        }
    复制代码

    上面的Demo类里面包含了Dapper.Contrib的所有实体配置选项

    • Table:指定实体对应地数据库表名,可忽略,但是忽略后实体对应地数据库表名会在末尾加个s,Demo对应Demos(感觉画蛇添足了)
    • Key:指定此列为主键(自动增长主键),可忽略,忽略后默认查找
    • ExplicitKey:指定此列为主键(不自动增长类型例如guid,ExplicitKey与Key地区别下面会详细讲)
    • Computed:计算属性,打上此标签,对象地insert,update等操作会忽略此列
    • Write:需穿一个bool值,false时insert,update等操作会忽略此列(和Computed的作用差不多,看了源码也没发现与Computed有什么不一样的地方,有了解的朋友可以赐教下哈)

    Key和ExplicitKey这两项都是指定列为主键的。区别是打上Key特性的列在插入时是不能指定值的,只能是数据库自动增长列,而ExplicitKey特性可以允许在插入时指定值,比如用guid为主键类型,则主键在插入时必须已经生成好。

    增删改查

    做好上面的配置后就可以进行实体的操作了,Dapper.Contrib与Dapper一样都是拓展了DbConnection对象,方法如下(未列出异步方法)

    • Get<T>(id);
    • IEnumerable<T> GetAll<T>();
    • int Insert<T>(T obj);
    • int Insert<T>(Enumerable<T> list);
    • bool Update<T>(T obj);
    • bool Update<T>(Enumerable<T> list);
    • bool Delete<T>(T obj);
    • bool Delete<T>(Enumerable<T> list);
    • bool DeleteAll<T>();

    值得注意的是,从源码得知,Get方法仅支持单主键查询,如果多主键或者没主键都会报错

     if (keyCount > 1)
                    throw new DataException($"{method}<T> only supports an entity with a single [Key] or [ExplicitKey] property");
     if (keyCount == 0)
                    throw new DataException($"{method}<T> only supports an entity with a [Key] or an [ExplicitKey] property");
  • 相关阅读:
    javascript js 内存泄露
    javascript js 内存泄露工具使用
    逻辑运算符及按位或与非比较难理解先放着87
    //测试全局变量及局部变量的输出结果的异同
    域名被墙原因
    编写转义字符:78页
    1.1-java创建包和类的方法
    浏览器方法及代码打包成APP的
    一个简单的jsp+servlet实例,实现简单的登录
    LeetCode.985-查询后偶数的总和(Sum of Even Numbers After Queries)
  • 原文地址:https://www.cnblogs.com/zl181015/p/12786049.html
Copyright © 2011-2022 走看看