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