AutoMapper 忽略子集合 属性
AutoMapper Ignore on child collection property
我正在尝试映射具有子对象集合的相同类型的对象,我发现 Ignore() 应用于子对象的属性似乎是嗯...被忽略了!
这是一个演示问题的单元测试。
class A
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<B> 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<A, A>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
Mapper.CreateMap<B, B>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
}
[TestMethod]
public void TestMethod1()
{
A src = new A { Id = 0, Name = "Source", Children = new List<B> { new B { Id = 0, Name = "Child Src" } } };
A dest = new A { Id = 1, Name = "Dest", Children = new List<B> { 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<A, A>()
.ForMember(dest => dest.Id, opt => opt.Ignore())
.ForMember(dest => dest.Children, opt => opt.Ignore());
Mapper.CreateMap<B, B>()
.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);
}
这将使事情正常进行。
我正在尝试映射具有子对象集合的相同类型的对象,我发现 Ignore() 应用于子对象的属性似乎是嗯...被忽略了!
这是一个演示问题的单元测试。
class A
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<B> 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<A, A>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
Mapper.CreateMap<B, B>()
.ForMember(dest => dest.Id, opt => opt.Ignore());
}
[TestMethod]
public void TestMethod1()
{
A src = new A { Id = 0, Name = "Source", Children = new List<B> { new B { Id = 0, Name = "Child Src" } } };
A dest = new A { Id = 1, Name = "Dest", Children = new List<B> { 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<A, A>()
.ForMember(dest => dest.Id, opt => opt.Ignore())
.ForMember(dest => dest.Children, opt => opt.Ignore());
Mapper.CreateMap<B, B>()
.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);
}
这将使事情正常进行。