我在使用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结果的对象“代理”。
你知道为什么会这样吗?你好!
答案 0 :(得分:1)
发现问题,使用automapper源代码查看幕后发生的事情。
当automapper正在处理IEnumerable集合时,它使用缓存机制来避免重新映射集合中存在的已映射对象。
你会说,公平,没有理由将相同的对象映射到不同的结果。
但是在我的场景中,我忘了添加我在映射声明中也使用了AfterMap委托。
在这个AfterMap中我这样做(为了避免循环引用问题):
mappedItem.InstitutionsImplantations.Institution.InstitutionsImplantations = null;
这个问题是,虽然它只影响了映射的结果(AfterMap委托),但没有别的,但我错了它也影响了“Cache”的实施! 这不是我想要的,因为在这种情况下它也会影响集合中的所有后续映射计算,使用“Null”表示以下映射的INSTITImplantations对象,而不是全新的映射。
我的第一个解决方案是干净的,因为缓存机制在2个“不同”映射之间不起作用。 我没有找到一种简单的方法来在automapper中禁用这种集合缓存机制!