2012-11-19 131 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

謝謝 - 現在我可以停止狩獵!我同意 - 多個目標似乎是最好的方法。 –