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

Posted

技术标签:

【中文标题】如何使用 AutoMapper 将父引用分配给子属性【英文标题】:How to assign parent reference to a property in a child with AutoMapper 【发布时间】:2011-05-21 14:43:51 【问题描述】:

我正在尝试找到一种配置 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; 

【问题讨论】:

【参考方案1】:

使用 AfterMap。像这样的:

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

【讨论】:

我希望完全避免使用循环,但您的回答似乎是唯一的选择。像: .ForMember(dest => dest.Parent, opt => opt.MapFrom(src => src)) 是我正在寻找的东西,但它不起作用。谢谢! 我也希望有一些不同的东西。如果您有 > 1 个需要处理的子列表,这会变得非常难看。 我知道这是一个古老的问题和答案,但你可以使用一些(更多)Linq ***.com/questions/398871/…【参考方案2】:

略显冗长

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

AfterMap

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

为了完整起见,这类事情不应该是 automapper 真正关心的问题,因为它会导致过度抽象的副作用。

【讨论】:

以上是关于如何使用 AutoMapper 将父引用分配给子属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将超级的类型分配给子构造函数

如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表

React Native 将父方法传递给子组件

分配给核心数据对象中的关系似乎会破坏对象

如何在 .NetCore 中使用 AutoMapper 高级功能

AutoMapper用法