[C#/.NET]使用Dapper的扩展组件DapperExtensions自定义映射主键,列/表的别名以及忽略部分列

C#开发 作者: Rector 27 次阅读 · 读完约需 1 分钟 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

前言

Dapper是.NET平台下的一个轻量的实体对象-数据表关系映射的工具组件,也被称为ORM。但从严格意义上来说,Dapper并没有一个完整ORM的所有功能,所以我将它看作一个关系映射组件。它取代了我们传统的DbHelper,并且面向实体对象与关系数据库实现映射。

用过Dapper的开发者应该知道,单纯的Dapper在便捷性来说还显得不是很给力,对数据库的CRUD(增,删,改,查)操作还需要编写原生的SQL语句,比如插入(INSERT)操作:

var count = connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)",new { a=1, b=1 });

DapperExtensions介绍

为了使我们更加面向对象,少写SQL语句,本文为大家介绍一个基于Dapper的开源扩展组件:DapperExtensions。

DapperExtensions的开源地址为:https://github.com/tmsmith/Dapper-Extensions

DapperExtensions是一个轻量型的扩展类库组件,通过为POCO添加基本的CRUD操作(Get、Insert、Update、Delete)来对Dapper进行扩展。对于更高级的查询场景,DapperExtensions提供了一个谓词系统,使用DapperExtensions,你可以不需要任何属性或基类继承来保持POCO的整洁性。

什么是POCO:POCO是指Plain Old Class Object,也就是最基本的CLR Class,在原先的EF中,实体类通常是从一个基类继承下来的,而且带有大量的属性描述。而POCO则是指最原始的Class,换句话说这个实体的 Class仅仅需要从Object继承即可,不需要从某一个特定的基类继承。主要是配合Code First使用。Cost Frist则是指我们先定义POCO这样的实体class,然后生成数据库。实际上现在也可以使用Entity Framework Power tools将已经存在的数据库反向生成POCO的class(不通过edmx文件)。

DapperExtensions具有以下特性

  • 零配置:所有方法均扩展至Dapper
  • 自动映射POCO的CRUD操作(Get、Insert、Update、Delete)
  • GetList(), Count()方法具有更高级的应用场景
  • GetPage()可返回分页的结果集
  • 自动支持Guid和整数主键(同时也支持手动配置其他类型的主键)
  • 可使用ClassMapper配置表别名,主键,列别名(实体属性)等的映射
  • 支持复合主键
  • 支持单数和复数表名(默认为单数表名)
  • 可用于更高级场景的易于使用的谓词系统。
  • 在生成的SQL中正确转义表/列名

DapperExtensions的命名规范

  • 实体类名称应该与数据库中的表名匹配。如果是复数表名,可以通过PlurizedAutoClassMapper配置支持。
  • 实体属性名应该与表中的每个列名匹配。
  • 按照惯例,主键应该命名为Id。当然,也可以通过自定义映射支持使用其他名称的主键。

DapperExtensions使用示例

打开Visual Studio(本文为Visual Studio 2019),创建一个名为DapperExtensionsDemo的控制台应用程序(.NET Framework),使用Nuget包管理工具安装DapperExtensions组件,如图:

Nuget包管理工具安装DapperExtensions组件

或者使用Nuget命令:

PM> Install-Package DapperExtensions

再创建一个实体类Customer.cs,如下:

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedOn { get; set; }
}

创建一个对应测试用的数据表Customer:

CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [Active] [bit] NULL,
    [CreatedOn] [datetime] NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

请注意:请保持实体类的属性名称与数据表的字段名称对应匹配。

编写一个测试向数据表Customer写入数据的代码,如下:

using DapperExtensionsDemo.Entities;
using System.Data.SqlClient;
using DapperExtensions;
using System;

namespace DapperExtensionsDemo
{
    class Program
    {
        private static readonly string _connectionString = "Server=(localdb)\\mssqllocaldb;Database=TestDb;Trusted_Connection=True;MultipleActiveResultSets=true";
        static void Main(string[] args)
        {
            Insert();
        }

        private static void Insert()
        {
            using (var cn = new SqlConnection(_connectionString))
            {
                var customer = new Customer { FirstName = "Rector", LastName = "Liu", Active = true, CreatedOn = DateTime.Now,Id=1 };
                var multiKey = cn.Insert(customer);
                Console.WriteLine("Id: {0}", multiKey.Id);
            }
        }
    }
}

运行测试程序,输出结果:

Id: 1

说明我们成功向数据表Customer写入了一条数据。

DapperExtensions自定义映射配置

DapperExtensions支持自定义映射配置,需要借助其中内置的ClassMapper,接下来我们演示如何为Customer添加自定义映射配置。

新建一个名为CustomerMapping.cs的类,续承自ClassMapper<T>泛型基类,代码如下:

namespace DapperMappingDemo.Entities
{
    public class CustomerMapping : ClassMapper<Customer>
    {

    }
}

然后,在这个类的构造函数中,我们就可以配置自定义映射关系,比如自定义表名,主键类型,列名,忽略部分列等等,如下:

using DapperExtensions.Mapper;
using DapperExtensionsDemo.Entities;

namespace DapperMappingDemo.Entities
{
    public class CustomerMapping : ClassMapper<Customer>
    {
        public CustomerMapping()
        {
            // 自定义映射的表名
            Table("Customer");

            // 自定义映射表的主键
            Map(m => m.Id)
                .Key(KeyType.Identity);// 主键的类型

            // 自定义列名
            Map(x => x.LastName)
                .Column("lastname")
                .Ignore(); // 忽略LastName这一列


            // 启用自动映射,一定要调用此方法
            AutoMap();
        }
    }
}

可选的主键类型(KeyType)有如下几种:

完成以上配置后,我们再测试写入数据(重新运行一次控制台应用程序),再打开数据库的Customer表,可以看到Id为2的这一行数据的LastName这一列数据被忽略掉(没被写入数据库),如下:

DapperExtensions查询操作

查询方法:

private static void GetSingle(int customerId)
{
    using (var cn = new SqlConnection(_connectionString))
    {
        var customer = cn.Get<Customer>(customerId);
        Console.WriteLine($"Id: {customer.Id}, FirstName: {customer.FirstName}, LastName: {customer.LastName}, Active: {customer.Active}, CreatedOn: {customer.CreatedOn}");
    }
}

输出结果:

Id: 1, FirstName: Rector, LastName: , Active: True, CreatedOn: 2019-07-12 16:27:07
Id: 2, FirstName: Rector, LastName: , Active: True, CreatedOn: 2019-07-12 16:28:10

更多关于DapperExtensions的操作,请查看https://github.com/tmsmith/Dapper-Extensions

阅读了该文章的人还浏览了...

本文永久链接码友网 » [C#/.NET]使用Dapper的扩展组件DapperExtensions自定义映射主键,列/表的别名以及忽略部分列

发布于: 2019-07-12 16:54:48
分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册