2011-04-06 82 views
5

我有EF EF生成的具有多個屬性的Person類。我也有一個類與幾個屬性的職業。一個人與多個工作有關,因此喬布斯是人的收集財產。使用AutoMapper將複雜視圖模型映射回具有集合屬性的模型

我創建了一個視圖模型爲這樣:

public class PersonViewModel 
{ 
    public Person Person{ get; set; } 
    public List<Job> Jobs{ get; set; } 
} 

從我的觀點,我張貼PersonViewModel的一個實例。我想使用AutoMapper將這個視圖模型映射回Person的一個實例,其Jobs集合屬性填充了視圖模型中的列表。

這可以完成嗎?到目前爲止,我曾嘗試:

Mapper.CreateMap<PersonViewModel, Person>(); 

,沒有運氣...

編輯:

OK,這樣做實際工作。我發現我在其他地方有一個問題...

我的Person對象也與PersonType表有一對多關係... PersonType成爲Person的導航屬性,並且自動映射器試圖映射此...這是它失敗的地方......我成功地傳遞了一個PersonTypeID來將Person與Person類型關聯起來。我認爲這將是我需要做的。我怎樣才能解決這個問題?

編輯2: 所以基本上在DB我的人表有一個PersonTypeID列(外鍵PersonType表)......這個被映射爲一個導航屬性人爲PersonType對象...

從我的形式來看,我有一個下拉列表,選擇其中通過PersonTypeID財產早在視圖模型中的人物對象的人類型...

automapper似乎正在尋找Person的PersonType nav屬性的值以映射...我得到一個AutoMapper.AutoMapperMappingException

錯誤

Destination property: PersonType 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 

回答

8

是的,這應該工作。如果模型和視圖模型共享相同的屬性 - 無論是集合 - 他們將AutoMapper自動映射,但是:

  • 他們需要的是同名
  • 如果映射是雙向的,地圖需要創建雙向的歡迎,並我甚至發現,如果它是單向的,我不得不創建mapboth方式
  • 如果你有JobJobViewModel所以集合是不同類型的(但命名以同樣的方式)只需爲我們創建一個地圖二。

我的直覺是這應該解決您的問題:創建映射兩種方式,看看是否有幫助:

Mapper.CreateMap<PersonViewModel, Person>(); 
Mapper.CreateMap<Person, PersonViewModel>(); 

編輯

如果您對您的視圖模型的屬性和模型和他們是不同的類型,AutoMapper不知道如何轉換它們。所以,一個選項是忽略它們:

Automapper: Ignore on condition of

或者你可以使用自定義映射:

http://lostechies.com/jimmybogard/2009/05/06/automapper-feature-custom-type-converters/

+0

你是正確的..我發現我的問題在別處。我編輯了我原來的問題...你會得到一個upvote指向我的正確道路...即時通過今天的投票,雖然:) – stephen776 2011-04-06 21:49:40

+0

謝謝斯蒂芬。好的,你可以詳細解釋一下你的問題,也許增加一些代碼?我在編輯過程中遇到困難。 – Aliostad 2011-04-06 21:52:14

+0

好吧加了一些。希望它有幫助 – stephen776 2011-04-06 21:57:02

0

或嘗試反向映射:

Mapper.CreateMap<Person, PersonViewModel>().ReverseMap(); 
相關問題