从父对象映射时,如何强制automapper忽略属性

时间:2013-12-31 08:05:44

标签: c# automapper

我有一个案例可以简化为:

public class ASource
{
   public string ID { get; set; }
   public virtual BSource B { get; set }
}

public class BSource
{
   public string ID { get; set; }
}

public class ADestination
{
   public string ID { get; set; }
   public virtual BDestination B { get; set }
}

public class BDestination
{
   public string ID { get; set; }
   public bool Used { get; set; }
}

Mapper.Map<BSource, BDestination>()
   .ForMember(item => item.Used, property => property.MapFrom(item => item.ID.Contains("Used")));

Mapper.Map<ASource, ADesctination>();

如果在映射ASource =&gt;时发生映射,如何强制automapper忽略映射BDestination.Used属性? ADestination?映射BSource =&gt;时BDestination我希望按照映射配置中的说明映射属性。

使用AfterMpa()方法来实现这不是一个解决方案 - 我使用的是可查询的扩展,它不适用于AfterMap()

3 个答案:

答案 0 :(得分:0)

您可以尝试:

 Mapper.Map<BSource, BDestination>()
 .ForMember(item => item.Used,
 property => property.MapFrom(item => item.ID.Contains("Used")))
 .Ignore(source => source.theFieldYouWantToIgnore);

答案 1 :(得分:0)

我唯一能想到的是

Mapper.CreateMap<ASource,ADestination>()
    .ForMember(adest => adest.B, 
               m => m.MapFrom(asrc => new BSource { ID = asrc.B.ID }) );

因此,您从没有BSource属性集的临时Used映射。当然,这不是太优雅,尤其是不是BSource有很多属性的时候。此外,我从不喜欢这些“脏”映射,因为大多数时候它们会影响不可见的代码。配置(一般情况下)不应控制程序流程。

我想我会保持简单并创建第二个BDestination类,以便在ADestination中使用。但我不知道您的代码中是否存在问题,因为您可能需要交替使用BDestination个对象(来自A或不来)。

答案 2 :(得分:0)

你需要做几件事:

Mapper.CreateMap<ASource, ADestination>()
    .AfterMap((src, dest) => { dest.B.Used = false; });
Mapper.CreateMap<BSource, BDestination>()
    .ForMember(dest => dest.Used, opt => src.ID.Contains("Used"));

因此,您将值默认为“false”,但是在映射了ASource之后 - &gt; ADestination,您填写子属性的“已使用”值。此AfterMap仅针对ASource / ADestination映射执行。

但是,这不适用于可查询扩展。基于映射入口点构建不同的表达式树现在有点过于复杂。