Automapper throws System.ArgumentException



我已将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.TagDTO.Objects.TagDto,尽管您在标签上具有相同的属性名称,而Tagdto

我猜我没有映射Tag类中的某些属性。如果是这样,请使用Ignore

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

在这里查看&amp;在这里&amp;这里

相关内容

  • 没有找到相关文章

最新更新