14

我有一个简单的更新功能:

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 实体,它的 Entity Key 属性被清空,因为我相信它存在于目标对象中,但不存在于源对象中,因此它被映射为其默认值(对于实体键,它是 null )

所以,我的问题是 Automapper 是否可以配置为仅尝试映射源对象和目标对象中存在的属性?我希望跳过实体键和导航属性等内容。

4

4 回答 4

10

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

根据您的具体要求。

于 2013-06-17T12:11:32.183 回答
7

代替

userData = _mapper.Map<Users, tblUserData>(user);

利用

 _mapper.Map(user, userData);

前者创建一个新的 userData 对象,其中仅包含用户对象中可用的属性。后者用用户对象中存在的属性覆盖现有的 userData 对象的属性,同时保留其余部分。

于 2020-12-17T21:26:15.063 回答
5

You can tell AutoMapper to ignore fields that you do not want mapped like this:

userData = Mapper.Map<Users, tblUserData>(user).ForMember(m => m.EntityKey, opt => opt.Ignore());
于 2013-06-17T12:12:53.127 回答
5

您可以通过创建一个小的扩展方法来忽略目标类型上不存在的所有属性来覆盖此行为。

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();

也可以根据您的需要自定义此方法,例如,通过专门忽略具有受保护或私有设置器的属性。

于 2017-10-29T18:25:17.617 回答