当AutoMapper遇到一个已经映射的对象时,它似乎会再次使用该对象,而不是尝试重新映射它。我相信它是基于.Equals()
做到这一点的。
我有一棵正在绘制的树。因此,一个具有一些属性的节点,以及子节点。多个节点具有相同的.Equals()
值,因为它基于Id属性。节点的子节点是不同的,我需要重新映射这些节点,但它使用的是缓存的map值。
有没有办法关闭缓存的映射?我所能想到的就是实现一个新的转换器,但这完全违背了使用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();
}
}
发布于 2015-03-24 00:05:58
现在有一个禁用缓存的选项。
Mapper.CreateMap<Tag, Tag>();
var results = Mapper.Map<IList<Tag>, IList<Tag>>(source, opt => opt.DisableCache = true);
发布于 2013-01-15 16:30:08
发布于 2012-10-12 22:43:14
似乎你映射的树对象的Equals行为是不合适的。
仅当“指定的对象等于当前对象”时,该方法才应返回true。- http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
在您的例子中,您有两个树对象共享相同的id,但很明显,它们不是“相等的”,因为它们有不同的子对象。
我建议看看为什么Equals方法以这种方式被滥用,你是否可以通过不覆盖Equals方法来获得所需的行为,而是使用一个不同的方法来检查具有更合适名称的树id字段,例如。TreeIdsAreEqual。
https://stackoverflow.com/questions/11333732
复制相似问题