我已将AutoMapper更新为版本2,现在我有很多问题...
我有一个ItemToMap
的列表,所有这些对象都有对同一对象Tag
当我尝试用ItemToMapDto
映射ItemToMap
时,我有一个错误:
automapper.automappermpappingexception:
映射类型: 标签 -> tagdto dal.entities.tag-> dto.objects.tagdto
目标路径: itemTomap [] [1] .tag.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:
自动应用程序正在缓存ResolutionContext
以重用已经设置的解析器。换句话说,它通过映射器循环,并以IsMatch
的呼叫返回true的映射器。要知道该ResolutionContext
是否已缓存,它检查了目标属性是否已经设置,并且上下文的哈希代码。由于目的地是在CTOR中设置的,因此Automapper认为这不是缓存的,因此,它称为未缓解的解析器。后一个解析器将缓存,但由于Hash代码已经存在于Dictionary
中,因此失败了。
这是一个错误。修复程序将在版本2.2.1
您必须注册DAL.Entities.Tag
和DTO.Objects.TagDto
,尽管您在标签上具有相同的属性名称,而Tagdto
我猜我没有映射Tag
类中的某些属性。如果是这样,请使用Ignore
Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore());
在这里查看&amp;在这里&amp;这里