AutoMapper IEnumerable映射bug

时间:2013-11-14 22:07:07

标签: c# entity-framework automapper

我在使用automapper时发生了一件奇怪的事情。

有人知道为什么这段代码会为INSTITImplantations字段返回一个值:

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);

虽然这个(在同一个集合中),但对于INSTITImplantations返回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个项是正确的,之后,某些项集合具有“严重”映射的INSTITImplantations属性。

INSTITImplantations属性是来自EF结果的对象“代理”。

你知道为什么会这样吗?

你好!

1 个答案:

答案 0 :(得分:1)

发现问题,使用automapper源代码查看幕后发生的事情。

当automapper正在处理IEnumerable集合时,它使用缓存机制来避免重新映射集合中存在的已映射对象。

你会说,公平,没有理由将相同的对象映射到不同的结果。

但是在我的场景中,我忘了添加我在映射声明中也使用了AfterMap委托。

在这个AfterMap中我这样做(为了避免循环引用问题):

mappedItem.InstitutionsImplantations.Institution.InstitutionsImplantations = null;

这个问题是,虽然它只影响了映射的结果(AfterMap委托),但没有别的,但我错了它也影响了“Cache”的实施! 这不是我想要的,因为在这种情况下它也会影响集合中的所有后续映射计算,使用“Null”表示以下映射的INSTITImplantations对象,而不是全新的映射。

我的第一个解决方案是干净的,因为缓存机制在2个“不同”映射之间不起作用。 我没有找到一种简单的方法来在automapper中禁用这种集合缓存机制!