如何让AutoMapper不缓存映射对象?

Jos*_*ose 23 .net c# automapper

当AutoMapper遇到已经映射的对象时,它似乎再次使用该对象,而不是尝试重新映射它.我相信它是基于这样做的.Equals().

我有一棵正在映射的树.所以,一个具有一些属性的节点和子节点.不止一个节点具有相同的值.Equals(),因为它基于Id属性.节点的子节点是不同的,我需要重新映射,但它使用缓存的映射值.

有没有办法关闭缓存的映射?我能想到的只是实现一个新的转换器,但这完全违背了使用AutoMapper的目的.

这是一个如何重现的例子.

void Main()
{
    var source = new List<Tag>
    {
        new Tag 
        { 
            Id = 1, 
            Name = "Tag 1", 
            ChildTags = new List<Tag>
            {
                new Tag 
                { 
                    Id = 2, 
                    Name = "Tag 2", 
                    ChildTags = new List<Tag> 
                    {
                        new Tag {Id = 3, Name = "Tag 3"},
                        new Tag {Id = 4, Name = "Tag 4"}
                    }
                }
            }
        },
        new Tag { Id = 1, Name = "Tag 1" },
        new Tag 
        {
            Id = 3, Name = "Tag 3", ChildTags = new List<Tag>
            {
                new Tag {Id = 4, Name = "Tag 4"}
            }
        }
    };

    Mapper.CreateMap<Tag, Tag>();
    var results = Mapper.Map<IList<Tag>, IList<Tag>>(source);

    results.Dump();
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Tag> ChildTags { get; set; }

    public override bool Equals(Object obj)
    {
        if (obj == null)
        {
            return false;
        }

        var x = this;
        var y = (Tag)obj;

        return x.Id.Equals(y.Id);
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ose 10

现在有一个禁用缓存的选项.

Mapper.CreateMap<Tag, Tag>();
var results = Mapper.Map<IList<Tag>, IList<Tag>>(source, opt => opt.DisableCache = true);
Run Code Online (Sandbox Code Playgroud)


oqx*_*oqx 9

我遇到了与mapper相同的问题,环顾四周我找到了一个解决方案,通过添加

Mapper.Reset();
Run Code Online (Sandbox Code Playgroud)

来源博客(更正后的网址)