2016-04-04 50 views
8

我不得不類一樣AutoMapper.Mapper.CreateMap <TSource,TDestination>()」已過時

class A 
{ 
public int id {get; set;} 
} 

class B 
{ 
public C c {get; set;} 
} 

class C 
{ 
public int id {get; set;} 
public string Name {get; set;} 
} 

我的要求是A類的ID映射到C類 的ID現在我是什麼直到現在爲止: Mapper.CreateMap()。ForMember(des => des.C.Id,src => src.MapFrom(x => x.id));

它工作正常。

現在看起來像Auto mapper已經改變了他們的實現。並且我收到如下警告:

AutoMapper.Mapper.CreateMap()'已過時:'動態創建的地圖將在版本5.0中刪除。使用MapperConfiguration實例並根據需要靜態存儲,或者使用Mapper.Initialize。使用CreateMapper創建一個映射器實例。

我需要映射具有不同名稱和結構的類的一些屬性。對此有任何幫助。

+2

看看[this](http://stackoverflow.com/questions/35256008/automapper-migrating-fro m-static-api)文章。 –

+0

@ diiN_的評論應該指向正確的方向,但是如果你仍然在努力,你可以使用NuGet或使用命令提示安裝以前的版本:Install-Package AutoMapper -Version 4.1.0 –

回答

16

此前

Mapper.CreateMap<Src, Dest>() 
.ForMember(d => d.UserName, opt => opt.MapFrom(/* ????? */)); 

這裏的問題是映射定義是靜態的,定義一次,在整個應用程序生命週期重用。在3.3之前,您需要重新定義每個請求的映射,並使用硬編碼值。由於映射配置是在與我們的映射執行不同的位置創建的,我們需要一些方法在我們的配置中引入運行時參數,然後在執行期間提供它。

這分兩部分完成:映射定義,我們創建一個運行時參數,然後在執行時提供它。要與運行參數創建映射定義,「假」的關閉,其中包括一個名爲局部變量:

Mapper.Initialize(cfg => { 

string userName = null; 
cfg.CreateMap<Source, Dest>() 
    .ForMember(d => d.UserName, 
     opt => opt.MapFrom(src => userName) 
    ); 
}); 

欲瞭解更多信息see this

對於一個或多個類

cfg.CreateMissingTypeMaps = true; 
cfg.CreateMap<Source, Dest>() 
    .ForMember(d => d.UserName, 
     opt => opt.MapFrom(src => userName) 
    ); 

cfg.CreateMap<AbcEditViewModel, Abc>(); 
cfg.CreateMap<Abc, AbcEditViewModel>(); 
}); 

在映射類

IMapper mapper = config.CreateMapper(); 
    var source = new AbcEditViewModel(); 
    var dest = mapper.Map<AbcEditViewModel, Abct>(source); 
+0

它工作正常但是有IT後的一個問題。 如果我們在兩個類中具有完全相同的屬性而不僅僅是 Mapper.map(Source,Destination)可以工作,並且不需要顯式映射。 但是,一旦我們使用 Mapper.Initialize(CFG => { 字符串username = NULL; cfg.CreateMap <源,目的地>() .ForMember(d => d.UserName, 選擇=> opt.MapFrom (src => userName) ); }); 沒有其他的Mapper.map(Source,Destination)有效(源和目標具有相同的屬性和結構) – Sharad

+0

您是源和目標類是通用的嗎?你必須爲每個映射組合創建映射 –

+0

不,我沒有泛型類。 – Sharad

0

最後我找到了分辨率。我在做:Mapper.Initialize{ Mapping field from source to destination } 在App_start中,並將此文件添加到global.asax - > Application_Start() - > GlobalConfiguration。

我需要添加我Mapper.Initialize這是cfg.CreateMissingTypeMaps = true;

現在,這個代碼將顯式映射,其中兩個類不具有相同的結構和性質的名稱在裏面工作一個多行。

除此之外,如果我們需要映射具有相同結構的兩個類的屬性,那麼代碼Mapper.map(source, destination)也可以工作,這是不工作的。

讓我知道是否有人對解決方案有困難。感謝所有的上述答覆。

0

似乎有點清潔的另一種方法是使MappingProfile類從Profile類AutoMapper

的繼承
public class MappingProfile:Profile 
{ 
    public MappingProfile() 
    { 
     CreateMap<Source1, Destination1>(); 
     CreateMap<Source2, Destination2>(); 
     ... 
    } 
} 

然後你初始化在啓動代碼Mapper.Initialize(c => c.AddProfile<MappingProfile>());映射

這將使您可以通過致電

destination1Collection = source1Collection.Select(Mapper.Map<Source1, Destination1>); 
相關問題