Automapper抛出System.ArgumentException

时间:2012-10-26 02:25:57

标签: c# automapper automapper-2

我已将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

2 个答案:

答案 0 :(得分:3)

这是一个错误。修复程序将在2.2.1版本中

答案 1 :(得分:1)

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

我猜你所映射的Tag类中的某些属性。如果是,请使用Ignore

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

查看Here&amp; Here&amp; Here