我有一个用于复制Person和State的映射,但是当我复制州时,我不想要一个人的深层副本,只需要参考,但是我使用的是automapper来创建一个人的深层副本否则,也有人和国家的映射。
public class Person
{
public string Name { get; set; }
}
public class State
{
public string Name { get; set; }
public Person CreatedBy { get; set; }
}
[TestMethod]
public void CopyByReference()
{
Mapper.CreateMap<Person, Person>();
Mapper.CreateMap<State, State>();
var original = new State { Name = "Start", CreatedBy = new Person { Name = "Employee name" } };
var copy = Mapper.Map<State>(original);
Assert.AreEqual(original.Name, copy.Name);
if (!ReferenceEquals(original.CreatedBy, copy.CreatedBy))
{
throw new Exception("I need a reference copy, not deep copy.");
}
}
我试图实现一个IValueResolver,但我也得到了深层复制。我可以简单地忽略CreatedBy属性并在映射后复制引用,但这非常难看并且看起来很容易出错。
答案 0 :(得分:2)
Automapper并不是真的为此设计的,因此如果它找到了一个,它总是会尝试使用映射,所以它总是试图映射你的Person
个对象......
一个解决方法是Ignore
CreatedBy
上的State
,并在AfterMap
回调中复制它:
Mapper.CreateMap<State, State>()
.ForMember(d => d.CreatedBy, c => c.Ignore())
.AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });
答案 1 :(得分:0)
您可以删除此行:Mapper.CreateMap<Person, Person>();
这应该使AutoMapper复制引用而不执行深层复制。