近期有用到dapper的自定义列映射,最后在网上找了很多资料,后来完美解决,记录下来,以备不时之需。
1.定义转换类
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 ConstructorInfo FindExplicitConstructor()
{
return _mappers
.Select(mapper => mapper.FindExplicitConstructor())
.FirstOrDefault(result => result != null);
}
}
public class ColumnAttributeTypeMapper : FallbackTypeMapper
{
public ColumnAttributeTypeMapper(Type type)
: base(new SqlMapper.ITypeMap[]
{
new CustomPropertyTypeMap(
type,
(type, columnName) =>
type.GetProperties().FirstOrDefault(prop =>
prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName)
)
),
new DefaultTypeMap(type)
})
{
}
}
2. 对需要自定义映射的实体增加接口约束,增加ColumnAttribute,配置映射关系
public interface ICustomDapperColumn
{
}
3. 通过反射批量注册映射规则, 下面这段可在 ConfigureServices 中注册
var assembly = typeof(ICustomDapperColumn).Assembly;
var types = assembly.GetTypes().Where(t => typeof(ICustomDapperColumn).IsAssignableFrom(t) && t.IsClass &&!t.IsAbstract);
foreach (var type in types)
{
SqlMapper.SetTypeMap(type, new ColumnAttributeTypeMapper(type));
}
4.通过上述注册即可正常使用dapper,会按照上述配置进行自动映射,dapper使用请查看dapper官网。例: 下图 role_id 会被映射为 SysRole的 roleId
最后备注:代码参考了很多个地方,出处有些遗失,就不一样标记出处了。希望能帮到有需要的人