如何使用AutoMapper将父级引用分配给子级中的属性

问题描述 投票:20回答:2

我正在尝试找到一种配置AutoMapper的方法,以使用其源父对象的引用在目标对象中设置属性。下面的代码显示了我要实现的目标。我正在将数据从数据对象移到Parent&Child实例中。映射可以很好地创建具有正确数据的List集合,但是我需要有一个ForEach来分配父实例引用。

public class ParentChildMapper
{
    public void MapData(ParentData parentData)
    {
        Mapper.CreateMap<ParentData, Parent>();
        Mapper.CreateMap<ChildData, Child>();

        //Populates both the Parent & List of Child objects:
        var parent = Mapper.Map<ParentData, Parent>(parentData);

        //Is there a way of doing this in AutoMapper?
        foreach (var child in parent.Children)
        {
            child.Parent = parent;
        }

        //do other stuff with parent
    }
}

public class Parent
{
    public virtual string FamilyName { get; set; }

    public virtual IList<Child> Children { get; set; }
}

public class Child
{
    public virtual string FirstName { get; set; }

    public virtual Parent Parent { get; set; }
}

public class ParentData
{
    public string FamilyName { get; set; }

    public List<Child> Children { get; set; }
}

public class ChildData
{
    public string FirstName { get; set; }
}
automapper
2个回答
54
投票

使用AfterMap。像这样的东西:

Mapper.CreateMap<ParentData, Parent>()
    .AfterMap((s,d) => {
        foreach(var c in d.Children)
            c.Parent = d;
        });

0
投票

稍微不那么冗长

CreateMap<Source, Dest>()
  .AfterMap((_, dest) => dest.Children.ForEach(x => x.Parent = dest))

AfterMap

之后对源和/或目标类型执行自定义功能成员映射

为了完整起见,这类事情实际上不应该成为automapper的关注,因为它会导致过度抽象的副作用。

© www.soinside.com 2019 - 2024. All rights reserved.