我已将AutoMapper更新到版本2,现在我遇到了很多问题......
我有一个ItemToMap
列表,所有这些对象都引用了同一个对象Tag
当我尝试使用ItemToMap
映射ItemToMapDto
时,我遇到了此错误:
AutoMapper.AutoMapperMappingException:
映射类型: 标签 - > TagDto DAL.Entities.Tag - > DTO.Objects.TagDto
目的地路径: ItemToMap [] [1] .Tag.Tag
来源价值: Entities.Tag ----> System.ArgumentException:已添加具有相同键的项目。
这是映射:
Mapper.CreateMap<ItemToMap, ItemToMapDto>();
Mapper.CreateMap<Tag, TagDto>();
这是突出我问题的单元测试:
var temp = new List<ItemToMap>();
var tag1 = this.RandomTag;
var length = 10;
for (int i = 0; i < length; i++)
{
temp.Add(new ItemToMap()
{
Tag = tag1,
});
}
var record = temp.ToArray();
var mapped = Mapper.Map<ItemToMap[], ItemToMapDto[]>(record);
让我的映射有效的解决方案是什么?我正在寻找全球解决方案,因为问题遍布代码......
编辑1:
问题来自下面的ctor,如果我评论ctor的代码,一切正常......
public class ItemToMapDto
{
public ItemToMapDto()
{
/* If I comment the line below, all's fine... But it not the behaviour
* I want, I'd like to have a default value for the property...
*/
this.Tag = new TagDto() { Name = this.RandomText };
}
public string Name
{
get;
set;
}
public TagDto Tag
{
get;
set;
}
}
编辑2:
Automapper正在缓存ResolutionContext
以重用已设置的解析器。换句话说,它遍历映射器并获取在IsMatch
的调用时返回true的映射器。要知道是否缓存了此ResolutionContext
,它会检查目标属性是否已设置以及上下文的哈希码。因为目标是在Ctor中设置的,所以Automapper认为它没有被缓存,因此它会调用未缓存的解析器。后一个解析器将缓存但失败,因为哈希码已存在于用作缓存存储库的Dictionary