首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让AutoMapper不缓存映射对象?

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

Stack Overflow用户
提问于 2012-07-05 02:09:10
回答 3查看 7.2K关注 0票数 24

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

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

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

这里有一个关于如何重现的例子。

代码语言:javascript
复制
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();
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-24 00:05:58

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

代码语言:javascript
复制
Mapper.CreateMap<Tag, Tag>();
var results = Mapper.Map<IList<Tag>, IList<Tag>>(source, opt => opt.DisableCache = true);
票数 10
EN

Stack Overflow用户

发布于 2013-01-15 16:30:08

我在使用映射器时也遇到过同样的问题,环顾四周,我发现了一个解决方案,通过添加

代码语言:javascript
复制
Mapper.Reset();

Source blog (已更正的URL)

票数 9
EN

Stack Overflow用户

发布于 2012-10-12 22:43:14

似乎你映射的树对象的Equals行为是不合适的。

仅当“指定的对象等于当前对象”时,该方法才应返回true。- http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

在您的例子中,您有两个树对象共享相同的id,但很明显,它们不是“相等的”,因为它们有不同的子对象。

我建议看看为什么Equals方法以这种方式被滥用,你是否可以通过不覆盖Equals方法来获得所需的行为,而是使用一个不同的方法来检查具有更合适名称的树id字段,例如。TreeIdsAreEqual。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11333732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档