asp.net-mvc-4 – Dapper.net如何创建地图
发布时间:2020-05-30 10:46:22 所属栏目: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); } 我想为dap
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 – 处理缓存和浏览器后退按钮的最佳方法是什么?
- 何时在ASP.NET上选择LAMP?
- ASP.NET MVC 2.0 – RenderPartial和RenderAction之间的区别
- 实体框架 – EF 7中的db.database.ExecuteSQLCommand等效项
- asp.net-mvc – 如何构建一个简单的ASP.NET MVC应用程序?
- asp.net(C#)禁止缓存文件不让文件缓存到客户端
- asp.net-mvc-4 – MVC 4如果经过身份验证,则从登录页面重定
- 使用ASP.NET通过POST接收(和发送)XML
- 为什么[System.ComponentModel.ToolboxItem(false)]默认来自
- asp.net-mvc – ASP.NET MVC ViewModel方法 – 是“合法”吗
推荐文章
站长推荐
- asp.net – 保持visual studio从bin / on重建中删
- asp.net-mvc – WebAPI窗体身份验证SimpleMember
- asp.net-mvc – MVC – Asp.Net Identity. HOWTO
- ASP.net会话状态服务信息
- asp.net – App_Code中的类无法通过Global.asax.
- asp.net-mvc-3 – ASP.NET MVC3 WebGrid – 自定
- asp.net – 如果缓存破坏程序与内容不匹配,防止捆
- asp.net-mvc-4 – 如何从远程计算机调试Visual S
- ASP.NET Web应用程序 – WebResource.axd和Scrip
- asp.net-mvc-5 – 如何在服务器上保存Rotativa P
热点阅读
