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)
我遇到了与mapper相同的问题,环顾四周我找到了一个解决方案,通过添加
Mapper.Reset();
Run Code Online (Sandbox Code Playgroud)
来源博客(更正后的网址)
| 归档时间: |
|
| 查看次数: |
6168 次 |
| 最近记录: |