1

automapper 发生了一件奇怪的事情。

有人知道为什么此代码会返回 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);

事实: IEnumerable 上的 autommaper 完成的映射对于列表中的 +/- 前 300 个项目是正确的,然后,某些项目集合具有“糟糕”映射的 InstitutionsImplantations 属性。

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

你知道为什么会这样吗?

给你!

4

1 回答 1

1

发现问题,使用automapper源码看看幕后发生了什么。

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

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

但在我的场景中,我忘记补充说我还在映射声明中使用了 AfterMap 委托。

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

mappedItem.InstitutionsImplantations.Institution.InstitutionsImplantations = null;

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

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

于 2013-11-16T10:01:07.833 回答