C# 自动映射抛出System.ArgumentException
我已经将AutoMapper更新到了第2版,现在我有很多问题 我有一个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
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());