AutoMapper忽略子集合属性上的映射

3
我正在尝试映射具有子对象集合的相同类型的对象,并发现应用于子对象上的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。

为什么会这样?
1个回答

7

AutoMapper 4.1.1存在几个bug。

第一个与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);
}

这将使事情正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接