2012-11-19 100 views
3

我使用Automapper将EF对象映射到DTO;许多对象都是多对多的安排。例如:我可以在一次性基础上忽略Automapper属性吗?

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

而且有Automapper地图<committee, CommitteeViewModel><committeemember, CommitteeMemberViewModel><person, PersonViewModel>

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

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

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

当然,我可以创建忽略这些属性和映射到这些新的DTO的,但因为我基本上想要的一切一个属性,我认为有可能是一个更好的办法,像创建一张不同的地图 - 但我无法找到它。

谢谢,

g。

+2

AFAIK您不能在“* map-time *”处指定您的映射的例外。你可以做的是指定成员映射的条件,如'ForMember(d => d.Items,opt => opt.Condition(s => s.Count> 4))''。不知道这是否有助于你的情况... – khellang

回答

2

可以达到期望的结果是这样的:创建新的映射(即覆盖现有的一个),映射源实体,并重写映射回:

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,我希望它每次都会产生相同的结果。因此,最好为“轻”版本的映射创建新的视图模型。

+0

这将工作,但我不会推荐它,因为你会散布映射器配置全部通过您的代码库。如果是我,我会调查@ khellang的建议。 – Mightymuke

+1

@Mightymuke,你可以看到,我也不推荐这个。此外条件来源不会在这里帮助 –

+0

谢谢 - 现在我可以停止狩猎!我同意 - 多个目标似乎是最好的方法。 –