AutoMapper の使用: ネストされたコレクションをマッピングする場合、マッピングされていないプロパティには元の値が保持されていると思います。代わりに、null に設定されています。
例:
次の 4 つのクラスがあります (プロパティはありますが、ないことに
注意しTest2Childてください)。NameTest1Child
public class Test1
{
public List<Test1Child> Children { get; set; }
}
public class Test2
{
public List<Test2Child> Children { get; set; }
}
public class Test1Child
{
public int Value { get; set; }
}
public class Test2Child
{
public string Name { get; set; }
public int Value { get; set; }
}
...そして簡単なマッピング設定。
Mapper.CreateMap<Test1, Test2>();
Mapper.CreateMap<Test1Child, Test2Child>().ForMember(m => m.Name, o => o.Ignore());
Mapper.AssertConfigurationIsValid(); // Ok
マッピング中に の元の値をTest2Child.Name保持したい....これが、マッピングされていないプロパティのデフォルトの動作になると思います。
Test1Childからに直接マップするとTest2Child、正常に動作します。Valueマップされ、Name保持されます。
var a = new Test1Child {Value = 123};
var b = new Test2Child {Name = "fred", Value = 456};
Mapper.Map(a, b);
Assert.AreEqual(b.Value, 123); // Ok
Assert.AreEqual(b.Name, "fred"); // Ok
ネストされたコレクション ( List<Test1Child>to List<Test2Child>)に対するマッピングの場合、
Valueは正しくマッピングされますが、 の元の値Nameは失われます!
var c = new Test1 { Children = new List<Test1Child> { new Test1Child { Value = 123 } } };
var d = new Test2 { Children = new List<Test2Child> { new Test2Child { Name = "fred", Value = 456 } } };
Mapper.Map(c, d);
Assert.AreEqual(d.Children[0].Value, 123); // Ok
Assert.AreEqual(d.Children[0].Name, "fred"); // FAILS! Name is null.
これを修正するにはどうすればよいですか?