【问题标题】:Can I ignore Automapper properties on a one-off basis?我可以一次性忽略 Automapper 属性吗?
【发布时间】:2012-11-19 18:31:08
【问题描述】:

我正在使用 Automapper 将 EF 对象映射到 DTO;许多对象是多对多排列的。例如:

committee (table) 1 =< m  committeemember (table)  m >= 1 person (table)

这可能映射到:

public class CommitteeViewModel
{
    public int idCommittee { get; set; }
    public IEnumerable<CommitteeMemberViewModel> CommitteeMembers { get; set; }
}

public class CommitteeMemberViewModel
{
    public int idCommittee { get; set; }
    public int idCommitteeMember { get; set; }
    public PersonViewModel Members { get; set; }
}

还有 &lt;committee, CommitteeViewModel&gt;&lt;committeemember, CommitteeMemberViewModel&gt;&lt;person, PersonViewModel&gt; 的 Automapper 映射。

当我想返回一个委员会及其成员时,一切都很好。

但是,当我想要一个没有成员的委员会列表时,有没有办法让 Automapper 忽略某些属性,只是为了那个电话?有点像:

var committeeList = Automapper.Mapper.Map
    <List<committee>, List<CommitteeViewModel>>(committees)
   .Ignore("CommitteeMembers");

当然,我可以创建忽略这些属性并映射到这些属性的新 DTO,但由于我本质上想要所有 一个属性,我认为可能有更好的方法,比如创建一个不同的地图——但我找不到它。

谢谢,

g.

【问题讨论】:

  • AFAIK 您无法在“map-time”指定映射例外。您可以做的是为成员映射指定条件,例如ForMember(d =&gt; d.Items, opt =&gt; opt.Condition(s =&gt; s.Count &gt; 4))。不确定这是否对您的情况有帮助...

标签: entity-framework automapper


【解决方案1】:

您可以通过这种方式获得所需的结果:创建新映射(即覆盖现有的映射)、映射源实体并覆盖映射回:

Mapper.CreateMap<committee, CommitteeViewModel>()
      .ForMember(c => c.CommitteeMembers, o => o.Ignore());

var committeeList = Mapper
      .Map<List<committee>, List<CommitteeViewModel>>(committees);

Mapper.CreateMap<committee, CommitteeViewModel>();

但我认为最好保持一致。如果我从委员会映射到 CommitteeViewModel,我希望它每次都会产生相同的结果。因此,最好为“轻”版映射创建新的视图模型。

【讨论】:

  • 这行得通,但我不建议这样做,因为您会在整个代码库中分散映射器配置。如果是我,我会调查@khillang 的建议。
  • @Mightymuke 如您所见,我也不推荐这样做。此外,来源条件在这里也无济于事
  • 谢谢——现在我可以停止打猎了!我同意——多个目标似乎是最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2011-06-26
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多