当 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();
}
}