AutoMapper忽略子集合属性

我试图映射具有子对象集合的相同类型的对象,并且发现应用于子对象上的属性的Ignore()似乎是umm …被忽略!

这是一个演示问题的unit testing。

class A { public int Id { get; set; } public string Name { get; set; } public ICollection Children { get; set; } } class B { public int Id { get; set; } public string Name { get; set; } } [TestClass] public class UnitTest1 { [TestInitialize()] public void Initialize() { Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.Ignore()); Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.Ignore()); } [TestMethod] public void TestMethod1() { A src = new A { Id = 0, Name = "Source", Children = new List { new B { Id = 0, Name = "Child Src" } } }; A dest = new A { Id = 1, Name = "Dest", Children = new List { new B { Id = 11, Name = "Child Dest" } } }; Mapper.Map(src, dest); } 

在Map调用之后,A对象的Id属性仍然是1,如预期的那样,但子B对象的Id属性从11更改为0。

为什么?

AutoMapper 4.1.1中有几个错误。

首先是关于UseDestinationValue : https : //github.com/AutoMapper/AutoMapper/issues/568

第二个是关于嵌套集合: https : //github.com/AutoMapper/AutoMapper/issues/934

可怕! 解决方法是直接映射B实例:

 Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Children, opt => opt.Ignore()); Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.Condition((ResolutionContext src) => false)); 

并添加其他映射调用:

 Mapper.Map(src, dest); Mapper.Map(src.Children.First(), dest.Children.First()); //example!!! 

你可以在循环中调用Mapper.Map

 for (int i = 0; i < src.Children.Count; i++) { var srcChild = src.Children[i]; var destChild = dest.Children[i]; Mapper.Map(srcChild, destChild); } 

这将使事情正常。