簡體   English   中英

Automapper - 它可以僅映射源對象和目標對象中的現有屬性嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM