C# 自动映射抛出System.ArgumentException

C# 自动映射抛出System.ArgumentException,c#,automapper,automapper-2,C#,Automapper,Automapper 2,我已经将AutoMapper更新到了第2版,现在我有很多问题 我有一个ItemToMap列表,所有这些对象都引用了同一个对象Tag 当我尝试将ItemToMap映射为ItemToMapDto时,出现以下错误: AutoMapper.AutoMappingException: 映射类型: 标记->标记到 DAL.Entities.Tag->DTO.Objects.TagDto 目标路径: ItemToMap[][1]。Tag.Tag 源值: 实体.标记 ---->System.ArgumentEx

我已经将AutoMapper更新到了第2版,现在我有很多问题

我有一个
ItemToMap
列表,所有这些对象都引用了同一个对象
Tag

当我尝试将
ItemToMap
映射为
ItemToMapDto
时,出现以下错误:

AutoMapper.AutoMappingException:

映射类型: 标记->标记到 DAL.Entities.Tag->DTO.Objects.TagDto

目标路径: ItemToMap[][1]。Tag.Tag

源值: 实体.标记 ---->System.ArgumentException:已添加具有相同密钥的项

以下是映射:

Mapper.CreateMap<ItemToMap, ItemToMapDto>();
Mapper.CreateMap<Tag, TagDto>();
编辑2:


Automapper正在缓存
ResolutionContext
以重用已设置的解析程序。换句话说,它在映射器中循环,并在调用
IsMatch
时获取返回true的映射器。要知道此
ResolutionContext
是否已缓存,它将检查是否已设置目标属性以及上下文的哈希代码。因为目标是在Ctor中设置的,所以Automapper认为这不是缓存的,因此,它调用未缓存的解析器。后一个解析器将缓存,但它会失败,因为哈希代码已经存在于用作缓存存储库的
字典中

您必须注册
DAL.Entities.Tag
DTO.Objects.TagDto
,尽管您在Tag和TagDto上有相同的属性名称

我猜您没有映射的
标记
类中的一些属性。如果是,则使用
忽略

Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());
Mapper.CreateMap().formMember(x=>x.value,opt=>opt.Ignore());

查看一下&

您必须注册
DAL.Entities.Tag
DTO.Objects.TagDto
,尽管您在Tag和TagDto上有相同的属性名称

我猜您没有映射的
标记
类中的一些属性。如果是,则使用
忽略

Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());
Mapper.CreateMap().formMember(x=>x.value,opt=>opt.Ignore());

看看&

这是一个bug。修复程序将出现在2.2.1版中,这是一个bug。修复程序将出现在2.2.1版中,这不是问题所在。我为每件事都画了一张地图。我更新了我的帖子来展示它。属性不是问题。有所有
字符串
字符串。IsNullOrEmpty
始终为false。该问题是由于Automapper的
ResolutionContext
的缓存策略造成的。更多信息,请参见我的编辑2,这不是问题所在。我为每件事都画了一张地图。我更新了我的帖子来展示它。属性不是问题。有所有
字符串
字符串。IsNullOrEmpty
始终为false。该问题是由于Automapper的
ResolutionContext
的缓存策略造成的。有关更多信息,请参阅我的编辑2
Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());