Dapper.ColumnMapper 的使用

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using FluentAssertions;

namespace Dapper.ColumnMapper.Tests
{
    [TestFixture]
    public class ColumnMapperTests
    {
        private SqlConnection connection;

        public static readonly string connectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=tempdb;Integrated Security=True";

        public class ColumnMappingObject
        {
            public string DefaultColumn { get; set; }
            public string NonMatchingColumn { get; set; }
            [ColumnMapping("MappedCol")]            public string MappedColumn { get; set; }
            public string MiscasedColumn { get; set; }
        }

        [TestFixtureSetUp]
        public void Setup()
        {
            connection = new SqlConnection(connectionString);
            connection.Open();

            CreateTestTable();

            SqlMapper.SetTypeMap(typeof(ColumnMappingObject), new ColumnTypeMapper(typeof(ColumnMappingObject)));
        }

        private void CreateTestTable()
        {
            const string createSql = @"
                create table #Test (Id int, DefaultColumn varchar(20), BadCol varchar(20), MappedCol varchar(20), miscasedColumn varchar(20))
                insert #Test values(1, ‘DefaultColumn1‘, ‘BadColumn‘, ‘MappedColumn1‘, ‘MiscasedColumn1‘)";

            connection.Execute(createSql);
        }

        [TestFixtureTearDown]
        public void TearDown()
        {
            if (connection != null && connection.State == ConnectionState.Open)
            {
                const string dropSql = "drop table #Test";
                connection.Execute(dropSql);

                connection.Close();
            }

            connection = null;
        }

        [Test]
        public void Property_Matching_Column_Name_Exactly_Is_Mapped_Correctly()
        {
            var selectedObject = SelectObjects();

            selectedObject.Should().NotBeNull();
            selectedObject.DefaultColumn.Should().NotBeNullOrEmpty();
            selectedObject.DefaultColumn.Should().Be("DefaultColumn1");
        }

        [Test]
        public void Property_Not_Matching_Coumn_Name_Exactly_And_No_Attribute_Is_Not_Mapped()
        {
            var selectedObject = SelectObjects();

            selectedObject.Should().NotBeNull();
            selectedObject.NonMatchingColumn.Should().BeNullOrEmpty();
        }

        [Test]
        public void Property_Using_Column_Mapping_Attribute_Is_Mapped_Correctly()
        {
            var selectedObject = SelectObjects();

            selectedObject.Should().NotBeNull();
            selectedObject.MappedColumn.Should().NotBeNullOrEmpty();
            selectedObject.MappedColumn.Should().Be("MappedColumn1");
        }

        [Test]
        public void Miscased_Property_Is_Mapped_Correctly()
        {
            var selectedObject = SelectObjects();

            selectedObject.Should().NotBeNull();
            selectedObject.MiscasedColumn.Should().NotBeNullOrEmpty();
            selectedObject.MiscasedColumn.Should().Be("MiscasedColumn1");

        }

        private ColumnMappingObject SelectObjects()
        {
            const string selectSql = "select * from #Test";

            return connection.Query<ColumnMappingObject>(selectSql).FirstOrDefault();
        }

        [Test]
        public void Can_Register_Single_Type()
        {
            ColumnTypeMapper.RegisterForTypes(typeof (DateTime));

            var map = SqlMapper.GetTypeMap(typeof(DateTime));

            map.Should().NotBeNull();
            map.Should().BeOfType<ColumnTypeMapper>();
        }

        [Test]
        public void Can_Register_Multiple_Types()
        {
            ColumnTypeMapper.RegisterForTypes(typeof(DateTime), typeof(TimeSpan));

            var dateTimeMap = SqlMapper.GetTypeMap(typeof (DateTime));

            dateTimeMap.Should().NotBeNull();
            dateTimeMap.Should().BeOfType<ColumnTypeMapper>();

            var timeSpanMap = SqlMapper.GetTypeMap(typeof (TimeSpan));

            timeSpanMap.Should().NotBeNull();
            timeSpanMap.Should().BeOfType<ColumnTypeMapper>();
        }

    }
}
时间: 2024-10-31 12:25:49

Dapper.ColumnMapper 的使用的相关文章

ECommon.Dapper

ECommon.Dapper 轻量级的dapper扩展 我们都知道Dapper这个orm框架,但是我们也知道他的扩展目前没有特别好的,今天我就推荐一个轻量级的很方便使用的一个扩展叫做 ECommon.Dapper,它是ECommon的一个类库,关于ECommon,它是Enode的一个common infrastructure,那么你又有问题了,Enode是啥? 我其实要说是 Dapper,重点是这个.关于Enode,出门左拐=>传送门 一:为什么选择ECommon.Dapper  1. 易用性强

使用dapper进行参数化查询

在使用Dapper操作Mysql数据库中我介绍了使用dapper进行CURD基本操作,但在示例代码中参数虽然也是通过@开头,但其实不是真正意义的参数化查询,而是拼接sql,这种方式不利于防止sql注入,所以在Dappe中可以使用DynamicParameters动态参数集合添加参数,从而实现dapper下的参数化查询: 示例代码 using (var connection = new MySqlConnection(connstr)) { //声明动态参数 DynamicParameters P

.NET轻量级ORM组件Dapper葵花宝典

一.摘要 为什么取名叫<葵花宝典>? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典". 如果您在工作中主要接触的是操作MySQL数据库,但您又想学习和了解.NET轻量级ORM框架Dapper,那么就请跟着阿笨一起学习本次的分享课<.NET轻量级ORM框架Dapper葵花宝典>.Let's Go,Do It ,Dapper For MySQL! 废话不多说,直接上干货,我们不生产干货,我们只是

Dapper源码讲解

Nuget下载dapper的程序集,浏览公开的方法,如下图所示 主要讲解:Execute方法的调用过程, public static int Execute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) 此方法代码: 内部调用了Execut

[转][Dapper]SQL 经验集

condition.Append(" AND ChineseName like @name"); p.Add("@name", "%" + name + "%", System.Data.DbType.String); like 也可以参数化查询. @a MSSQL 的参数写法 :a Oracle 的参数写法 ? OleDb 的参数写法 Access 中 * 表示模糊匹配 MSSQL / Oracle 中 % 表示模糊匹配 A

02-大鸭梨博客系统数据库设计及Dapper的使用

毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配合.数据库设计是整个系统的根基,它关乎系统功能的实现.稳定性.扩展性等多个方面,可见数据库设计的重要性. 那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点: 1.充分体现系统的需求 不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业

ASP .Net Core 使用 Dapper 轻型ORM框架

一:优势 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快.Dapper的速度接近与IDataReader,取列表的数据超过了DataTable. 3,Dapper支持什么数据库.Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db 4,Dapper的r支持多表并联的对象.支持一对多 多对多的关系.并且

Topshelf+Quartz.net+Dapper+Npoi(一)

背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不就得了,这有什么麻烦的?B说:我了个亲娘来,还写服务呢?你还需要搞个timer去判断时间点?多费劲啊,直接写个控制台程序,添加个任务计划,不就搞定了吗?我只想说:你们都是大神,每次都不加点新的东西,还写什么代码,多么没劲啊,前两天看到了topshelf+quartz.net这个东东,可以做个练习了.

EntityFramework、Dapper vs 草根框架性能

EntityFramework.Dapper vs 草根框架性能 扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 EntityFramework 和 NHibernate,还有一些出自草根之手的,如 Chloe.ORM.各式各样,层出不穷.试问,为何要重复造轮子?很简单,咱来自火星,目前地球上还没一款轮子适合咱这辆火星车~ 为加深对各个 ORM 框架的了解,同时也想看看咱自己的框架性能如何,也可以让对 Chloe 感兴趣