asp.net-mvc-4 – Dapper.net如何创建地图
发布时间:2020-12-16 04:12:30 所属栏目:asp.Net 来源:网络整理
导读:public CodeCustomMapper() { Map(f = f.Name).Column("SName"); Map(f = f.Name).Column("TName"); Map(f = f.EmailID).Column("wmail"); Map(f = f.EmailID).Column("Email"); } 我想为dapper.query函数创建这种映射. 请有人帮忙吗? 我想将自定义列名称映
public CodeCustomMapper() { Map(f => f.Name).Column("SName"); Map(f => f.Name).Column("TName"); Map(f => f.EmailID).Column("wmail"); Map(f => f.EmailID).Column("Email"); } 我想为dapper.query函数创建这种映射. public class EntityBase { public string CreatedBy { get; set; } public DateTime CreatedOn { get; set; } } public class Person :EntityBase { public string SecurityAlias{ get; set; } public DateTime Identifier{ get; set; } } public class EntityBaseMap { public EntityBaseMap() { var map = new CustomTypeMap<EntityBase>(); map.Map("CreatingPerson","CreatedBy"); map.Map("CreatedDate","CreatedOn"); SqlMapper.SetTypeMap(map.Type,map); } } public class PersonMap { public PersonMap() { var map = new CustomTypeMap<Person>(); map.Map("security_alias","SecurityAlias"); map.Map("Id","Identifier"); SqlMapper.SetTypeMap(map.Type,map); } } 当我这样称呼时: EntityBaseMap entityBaseMap = new EntityBaseMap(); PersonMap personMap = new PersonMap(); 现在,如果我使用Person实体,它不会在person实体内映射EntityBase属性. 解决方法
基本上,您需要编写一个ITypeMap和IMemberMap实现,它在内部可以基于您选择的任何规则(命名约定,如删除S等标识符,下划线等;属性;或自定义映射,如您的情况).
这是一个完整的可运行示例,可能会有所帮助: using Dapper; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Reflection; class SomeType { public string Bar { get; set; } public int Foo { get; set; } } static class Program { static Program() { // only need to do this ONCE var oldMap = SqlMapper.GetTypeMap(typeof(SomeType)); var map = new CustomTypeMap(typeof(SomeType),oldMap); map.Map("IFoo","Foo"); map.Map("SBar","Bar"); SqlMapper.SetTypeMap(map.Type,map); } static void Main() { using (var conn = new SqlConnection("Server=.;Database=master;Trusted_Connection=true")) { conn.Open(); var row = conn.Query<SomeType>("select 123 as [IFoo],'abc' as [SBar]").Single(); Console.WriteLine(row.Foo); Console.WriteLine(row.Bar); } } class CustomTypeMap : SqlMapper.ITypeMap { private readonly Dictionary<string,SqlMapper.IMemberMap> members = new Dictionary<string,SqlMapper.IMemberMap>(StringComparer.OrdinalIgnoreCase); public Type Type { get { return type; } } private readonly Type type; private readonly SqlMapper.ITypeMap tail; public void Map(string columnName,string memberName) { members[columnName] = new MemberMap(type.GetMember(memberName).Single(),columnName); } public CustomTypeMap(Type type,SqlMapper.ITypeMap tail) { this.type = type; this.tail = tail; } public System.Reflection.ConstructorInfo FindConstructor(string[] names,Type[] types) { return tail.FindConstructor(names,types); } public SqlMapper.IMemberMap GetConstructorParameter( System.Reflection.ConstructorInfo constructor,string columnName) { return tail.GetConstructorParameter(constructor,columnName); } public SqlMapper.IMemberMap GetMember(string columnName) { SqlMapper.IMemberMap map; if (!members.TryGetValue(columnName,out map)) { // you might want to return null if you prefer not to fallback to the // default implementation map = tail.GetMember(columnName); } return map; } } class MemberMap : SqlMapper.IMemberMap { private readonly MemberInfo member; private readonly string columnName; public MemberMap(MemberInfo member,string columnName) { this.member = member; this.columnName = columnName; } public string ColumnName { get { return columnName; } } public System.Reflection.FieldInfo Field { get { return member as FieldInfo; } } public Type MemberType { get { switch (member.MemberType) { case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; default: throw new NotSupportedException(); } } } public System.Reflection.ParameterInfo Parameter { get { return null; } } public System.Reflection.PropertyInfo Property { get { return member as PropertyInfo; } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 在stackoverflow.com上永不过期的会话,除非
- asp.net-mvc – ASP.NET MVC:将会话状态保存在类似向导的应
- asp.net – 当主机名中有下划线时,表单身份验证无法识别为在
- ASP.Net会员登录问题
- asp.net-mvc – 如何在ASP.NET MVC中使用单选模式创建ListB
- asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
- ASP.NET批量下载文件的方法
- asp.net-mvc – 如何在ASP.NET MVC w / VB.NET中添加id HTM
- iis – 在ASP类中处理End Request事件
- asp.net-mvc-3 – ASP.NET控制器名称与文件夹名称冲突
推荐文章
站长推荐
- asp.net-mvc – 如何使用Ninject将服务注入授权过
- asp.net-mvc – 如何获取视图html并返回客户端
- asp.net-mvc – 什么是FTP部署asp.net mvc网站的
- asp.net-mvc-3 – 使用Windows身份验证获取WCF中
- asp.net-mvc – Identity Server 3 – 客户端应用
- 使用ASP.NET Identity实现基于声明的授权,高级篇
- 单元测试 – 自动测试经典ASP
- 用于创建ASP.NET成员资格提供程序用户的脚本
- asp.net – 常量SQL Server 80%CPU利用率
- asp.net – 即使在IIS的web.config中使用标签后,
热点阅读