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

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

 

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