2011-08-08 38 views
60

我想設置AutoMapper從實體轉換到DTO。我知道我應該在Mapper.CreateMap<Entity, DTO>()之後使用.ForMember()來設置自定義映射,但這似乎不是一種可用的方法。如何使用AutoMapper .ForMember?

編輯澄清: 我沒有找到我已閱讀的文檔的鏈接,或對基本語法的解釋。我使用的是正確的語法爲答案和文檔描述,例如:

Mapper.CreateMap<EFAddress, Address>() 
     .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name)); 

如果我中CreateMap <有一個無效的類型名稱>我可以看到「ForMember」作爲一種有效的方法,鼠標懸停顯示方法簽名,正如我通常所料。但是,只要我給它兩個有效的類型,ForMember就說它不能解析該符號,就好像該方法不可用一樣。

對於我不會遇到的泛型類有某種約束嗎?

感謝

+2

http://automapper.codeplex.com/wikipage?title=Flattening&referringTitle=Home可能是您要做的最好的文檔。不要忘記CreateMap調用的通用參數。 – Travis

+2

應該注意,下面所有答案中引用的靜態Mapper.CreateMap ()'方法現在(2016)[已過時](https://lostechies.com/jimmybogard/2016/01/21 /移除最靜態API-從-automapper /)。 –

回答

12

最後,我相信這竟然是某種與ReSharper的不兼容。

ReSharper似乎已導致Automapper代碼顯示不正確,但工作得很好(即使它顯示紅色帶有錯誤消息)。卸載ReSharper完全解決了這個問題。

+2

ReSharper的哪個版本?什麼版本的AutoMapper? –

+1

我認爲這個問題會影響VisualStudio 2010中的AutoMapper和ReSharper 8.x。請參閱https://github.com/AutoMapper/AutoMapper/issues/381 – dthrasher

+0

對於我來說,重新編號8.2,但與2012年,與7.0工作正常。 –

89

嘗試的語法如下:

Mapper 
    .CreateMap<Entity, EntityDto>() 
    .ForMember(
     dest => dest.SomeDestinationProperty, 
     opt => opt.MapFrom(src => src.SomeSourceProperty) 
    ); 

,或者如果源和目的性都只是相同的名稱:

Mapper.CreateMap<Entity, EntityDto>(); 

請檢出documentation的相關章節更多細節和其他映射場景。

+1

我的問題是,當試圖在該上下文中使用「ForMember」時,我只是得到「無法解析符號'ForMember'」,就好像該方法不存在 – Nellius

+0

@Nellius,你沒有顯示你的*非工作*代碼。我已經展示了一個實例。確保你已經定義了源和目標泛型類,你已經在你的項目中引用了AutoMapper,並且文檔(和我的答案)中顯示的語法也能工作。 –

+3

愚蠢的問題,選擇什麼意思? –

-5

你做這樣的

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here) 

This page有一些很好的例子

5

樣本實施情況如下:

Mapper.CreateMap<Game, GameViewModel>() 
    .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type)) 

我們需要映射因爲名稱此屬性Game和GameViewModel的屬性是不同的 - 如果它們是相同的並且是相同的類型,那麼它不需要ForMember

另一個使用ForMember的是忽略映射

Mapper.CreateMap<Game, GameViewModel>() 
    .ForMember(dest => dest.Prize, opt => opt.Ignore());