dapper 自定义数据库字段和代码中Model字段不一致时候的mapping方法

namespace YourNamespace
{
    /// <summary>
    /// Uses the Name value of the ColumnAttribute specified, otherwise maps as usual.
    /// </summary>
    /// <typeparam name="T">The type of the object that this mapper applies to.</typeparam>
    public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper
    {
        public ColumnAttributeTypeMapper()
            : base(new SqlMapper.ITypeMap[]
                {
                    new CustomPropertyTypeMap(
                       typeof(T),
                       (type, columnName) =>
                           type.GetProperties().FirstOrDefault(prop =>
                               prop.GetCustomAttributes(false)
                                   .OfType<ColumnMappingAttribute>()
                                   .Any(attr => attr.Name == columnName)
                               )
                       ),
                    new DefaultTypeMap(typeof(T))
                })
        {
        }
    }

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
    public class ColumnMappingAttribute : Attribute
    {
        public string Name { get; set; }
    }

  public class FallbackTypeMapper : SqlMapper.ITypeMap
    {
        private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;

        public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers)
        {
            _mappers = mappers;
        }

        public ConstructorInfo FindConstructor(string[] names, Type[] types)
        {
            foreach (var mapper in _mappers)
            {
                try
                {
                    ConstructorInfo result = mapper.FindConstructor(names, types);
                    if (result != null)
                    {
                        return result;
                    }
                }
                catch (NotImplementedException)
                {
                }
            }
            return null;
        }

        public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName)
        {
            foreach (var mapper in _mappers)
            {
                try
                {
                    var result = mapper.GetConstructorParameter(constructor, columnName);
                    if (result != null)
                    {
                        return result;
                    }
                }
                catch (NotImplementedException)
                {
                }
            }
            return null;
        }

        public SqlMapper.IMemberMap GetMember(string columnName)
        {
            foreach (var mapper in _mappers)
            {
                try
                {
                    var result = mapper.GetMember(columnName);
                    if (result != null)
                    {
                        return result;
                    }
                }
                catch (NotImplementedException)
                {
                }
            }
            return null;
        }
    }

}
public static IEnumerable LoadWithCustomMapping()
{
    using (var conn = OpenDBConnection())
    {
        Dapper.SqlMapper.SetTypeMap(typeof(MyArea), new ColumnAttributeTypeMapper());
        return conn.Query("SELECT TOP 10 CAID,CAName,En FROM CityArea");
    }
}
时间: 2024-11-09 23:58:00

dapper 自定义数据库字段和代码中Model字段不一致时候的mapping方法的相关文章

数据库指定库表中的字段进行备份,并以表格的形式定时发送邮件到指定邮箱 ?

备份数据进行定时邮件发送 mkdir -p /opt/module/shell/ mkdir -p /opt/module/shell/sql/revenue.sql mkdir -p /opt/module/shell/csv/revenue #MailTool.jar 放在指定目录下 便于发送邮件使用 可自动生成表格 vim /opt/module/shell/daily_text.sh # !/bin/bash #数据库指定库.表中的字段进行备份,并以表格的形式发送邮件到指定邮箱 #定义变

[数据库] 取指定表中某字段的累加和不超过总和80%的行

有表 Table_1, 字段 Value int,  P float .5 要取出以 Value 字段倒序的 P 字段累加和 不超过 整个表中P字段总和的 80%的行.  并在返回列表中 加入字段 SUM ,存放当前行与前面所有行的累加和. 折腾了半天, 写了下面的查询sql: declare @e float select @e = sum(P) from [Table_1] Set @e = @e * 0.8 ;with T as ( select [ID] = row_number() o

PDM生成数据库-2去除PDM中各字段的约束项

Option   Explicit ValidationMode   =   True InteractiveMode =   im_Batch Dim   mdl   '当前model '获取当前活动model Set   mdl   =   ActiveModel If   (mdl   Is   Nothing)   Then MsgBox   "There   is   no   current   Model " ElseIf   Not   mdl.IsKindOf(PdP

ThinkPhP中model字段映射 $_map

1 <?php 2 class UserModel extends RelationModel{ 3 /**将表单中的name映射到该表中的username**/ 4 protected $_map = array( 5 'name' => 'username', 6 ); 7 /*所以在表单提交时不需要改变表单中的'name'名称 8 *当要读出'name'的值时,表中存在的是username,所以,需要用函数转化 9 *$data = $User->parseFieldsMap($d

数据库修改一个表中的字段值等于另一个表字段值

(MS SQL Server)语句:Sql代码 update   b  set   ClientName   =   a.name   from   a,b   where   a.id   =   b.id    (Oralce)语句:Sql代码 update   b  set   (ClientName)   =  (SELECT name FROM a WHERE b.id = a.id) 原文地址:https://www.cnblogs.com/hujiapeng/p/8311710.h

model字段对象和forms字段对象的区别和联系

一.model字段对象 (一)_meta _meta是django.db.models.options.Options的实例,获取字段对象可通过模型类来进行获取,而_meta可提供如下功能: 获取模型的所有字段实例 通过名称获取模型的单个字段实例 1.获取模型的单个字段实例 In [19]: models.Book._meta.get_field("title") Out[19]: <django.db.models.fields.CharField: title> 2.获

代码中设置 actionbar 上home等图标显示跟隐藏

今天在做项目的时候,遇到了一个问题,就是要把home在代码中动态显示跟隐藏.现在把方法记录如下 我们可以使用 setDisplayOptions(mask, mask); 来设置home按钮显示的,它的具体用法如下 (1)如果只有一个参数,那么它就是直接设定显示项, 如, int options = DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO: setDisplayOptions(options); 那么,actionbar就会显示home跟log按钮,也就是,里面

actionbar-home按键代码中设置显示跟隐藏

今天在做项目的时候,遇到了一个问题,就是要把home在代码中动态显示跟隐藏.现在把方法记录如下 public void removeBackButton() { if (mActionBar == null) { return; } // Remove the back button but continue showing an icon. final int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME;

Django如何从Model中获取字段名称——verbose_name

一.背景 CRM项目重新总结一下,重写之前的项目发现有不少知识点已经忘记,所以特此来重新总结一下一便后续能够回忆起 二.代码分析 1. 核心代码 from django.conf.urls import url from django.shortcuts import HttpResponse,render class VbcConfig(object): list_display = [] def __init__(self,model_class,site): self.model_clas