2013-11-14 75 views
0

我有一件奇怪的事情發生在automapper上。AutoMapper IEnumerable映射錯誤

難道有人有線索,爲什麼這個代碼是爲InstitutionsImplantations場返回值:

var result1 = new List<DataModel.Implantations>(); 
foreach (var c in collection) 
{ 
    DataModel.Implantations i = Mapper.Map<DataModel.Implantations>(c); 
    result1.Add(i); 
} 
var item1 = result1.Where(x => x.Nom == "Valdor").FirstOrDefault(); 
Console.WriteLine(item1.InstitutionsImplantations); 

雖然這一個(在相同的集合),用於InstitutionsImplantations返回null:

var result2 = Mapper.Map<IEnumerable<DataModel.Implantations>>(collection); 
var item2 = result2.Where(x => x.Nom == "Valdor").FirstOrDefault(); 
Console.WriteLine(item2.InstitutionsImplantations); 

事實: autommaper在IEnumerable上完成的映射對於列表中的+/- 300個項目是正確的,然後是某個項目集合具有「嚴重」映射的InstitutionsImplantations屬性。

InstitutionsImplantations屬性是來自EF結果的對象「代理」。

你知道爲什麼會發生這種情況嗎?

Tx you!

+0

從來沒有見過類似的東西,但使用AutoMapper的「正常」方法是'collection.Select(c => Mapper.Map (c))''所以你不需要臃腫的'IEnumerable'映射。這種形式基本上與您的第一個片段相同。不回答當然的問題。知道這是否是一個bug會很有趣。 –

回答

1

發現問題,使用automapper源代碼來查看幕後發生了什麼。

當automapper處理IEnumerable集合時,它使用緩存機制來避免必須重新映射集合中存在的已映射對象。

你會說,它的公平,沒有理由有相同的對象映射到不同的結果。

但在我的情況下,我忘了補充說我還在映射聲明中使用了一個AfterMap委託。

在這種AfterMap我這樣做(爲了避免循環引用的問題):

mappedItem.InstitutionsImplantations.Institution.InstitutionsImplantations = null; 

的這此問題是,我雖然它只是影響的映射(AfterMap代表)的結果,沒有別的,但我錯了,它也正在影響正在實施的「Cache」! 這不是我想要的,因爲在這種情況下,它也會影響集合中的所有映射計算,對於以下映射的InstitutionsImplantations對象使用「Null」而不是全新的映射。

我的第一個解決方案很乾淨,因爲緩存機制在2個「不同」映射之間不起作用。 而我沒有找到一個簡單的方法來禁用automapper中的這個集合緩存機制!