![](/img/trans.png)
[英]Can Automapper map a complex source graph to a flat destination without prefixes in the destination properties and without custom mappings?
[英]Automapper - can it map over only existing properties in source and destination objects?
我有一个简单的更新功能:
public void Update(Users user)
{
tblUserData userData = _context.tblUserDatas.Where(u => u.IDUSER == user.IDUSER).FirstOrDefault();
if (userData != null)
{
Mapper.CreateMap<Users, tblUserData>();
userData = Mapper.Map<Users, tblUserData>(user);
_context.SaveChanges()
}
}
userData 是一个 EF 实体,它的实体键属性被清零,因为我相信它存在于目标对象中,而不是源对象中,所以它被映射到它的默认值(对于实体键,这是空的)
所以,我的问题是可以将 Automapper 配置为仅尝试映射源对象和目标对象中都存在的属性吗? 我希望跳过诸如实体键和导航属性之类的内容。
如果需要,您可以明确告诉AutoMapper
Ignore
某些属性,如下所示:
Mapper.CreateMap<Users, tblUserData>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
这意味着目标对象中的 Id 列将始终保持不变。
您可以使用Condition
选项来指定是否根据逻辑条件的结果应用映射,如下所示:
Mapper.CreateMap<Users, tblUserData>()
.ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id.HasValue));
或者
Mapper.CreateMap<Users, tblUserData>()
.ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id != null));
取决于您的具体要求。
代替
userData = _mapper.Map<Users, tblUserData>(user);
用
_mapper.Map(user, userData);
前者创建一个新的 userData 对象,其中仅包含 user 对象中可用的属性。 后者使用用户对象中存在的属性覆盖现有的 userData 对象的属性,同时保留其余属性。
您可以告诉 AutoMapper 忽略您不希望这样映射的字段:
userData = Mapper.Map<Users, tblUserData>(user).ForMember(m => m.EntityKey, opt => opt.Ignore());
您可以通过创建一个小的扩展方法来忽略目标类型上不存在的所有属性来覆盖此行为。
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
&& x.DestinationType.Equals(destinationType));
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
然后可以按如下方式进行映射:
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
也可以根据您的需要自定义此方法,例如,通过专门忽略具有受保护或私有 setter 的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.