【问题标题】:Automapper mapping objects with collectionsAutomapper 用集合映射对象
【发布时间】:2017-05-17 02:46:29
【问题描述】:

我有一个对象,我们称它为 Parent,其中包含儿子和女儿的集合。

public class Parent {
    ICollection<Son> ParentsSons { get; set; }
    ICollection<Daughter> ParentsDaughters { get; set; }
}

public class Son {
   public Parent Parent { get; set; }
}

public class Daughter{
   public Parent Parent { get; set; }
}

让我们假设有来回映射的模型类和数据类。

 Mapper.Initialize(cfg =>
 {
     cfg.CreateMap<Data.Parent, Models.Parent>() .AfterMap((src, dest) =>
     {
       foreach (var i in dest.Sons)
           i.Son = dest;
       foreach (var i in dest.Daughters)
           i.Daughters = dest;
     })
     .ReverseMap();

     cfg.CreateMap<Data.Son, Models.Son>().ForMember(m => m.Parent, opt => opt.Ignore()).ReverseMap();
     cfg.CreateMap<Data.Daughter, Models.Daughter>().ForMember(m => m.Parent, opt => opt.Ignore()).ReverseMap();
}

我忽略了每个儿子和女儿的父母,然后将父母映射到父母的 AfterMap 中的每个儿子和女儿。这就是我在下面设置它的示例中的完成方式。

我可以拉出一个父母,然后儿子和女儿的集合回来了,我可以使用它们以及所有这些,这就是我想要的。我可以拉一个儿子或女儿,然后父母回来。

我遇到的问题是将某些东西拉回来,然后将其送回以保存它。当我创建一个新的父级,然后将儿子或女儿添加到其中时,我可以保存那个新的父级,它会保存儿子和女儿以及所有内容,但是当我从数据库中拉回一个父级、儿子或女儿并更改某些内容时,尝试将其发回,它在 Models.Parent => Data.Parent 的映射中失败并出现 Stack Overflow 异常。

当我提取数据时,是否可以很好地映射 Data.Parent => Models.Parent... 那为什么会失败?

数据类是 EF 生成的,模型类只是放置在不同层中的数据类的副本。

【问题讨论】:

    标签: c# entity-framework automapper


    【解决方案1】:

    您需要在反向映射(模型 -> 数据)中配置 Parent 成员,就像对数据 -> 模型映射所做的那样:

    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<Data.Parent, Models.Parent>().AfterMap((src, dest) =>
        {
            foreach (var i in dest.Sons)
                i.Parent = dest;
            foreach (var i in dest.Daughters)
                i.Parent = dest;
        })
        .ReverseMap().AfterMap((src, dest) =>
        {
            foreach (var i in dest.Sons)
                i.Parent = dest;
            foreach (var i in dest.Daughters)
                i.Parent = dest;
        });
    
        cfg.CreateMap<Data.Son, Models.Son>()
            .ForMember(m => m.Parent, opt => opt.Ignore())
        .ReverseMap()
            .ForMember(m => m.Parent, opt => opt.Ignore());
    
        cfg.CreateMap<Data.Daughter, Models.Daughter>()
            .ForMember(m => m.Parent, opt => opt.Ignore())
        .ReverseMap()
            .ForMember(m => m.Parent, opt => opt.Ignore());
    });
    

    【讨论】:

    • 我的意思是,你在开玩笑,这很容易。这是有道理的,但我只是觉得ReverseMap() 反过来做了同样的事情。
    • 无需手动执行此操作,我得到的 StackOverflowException 与您原始帖子中的相同。代码看起来一样,但实际上在ReverseMap 之后的部分中,srcdest 是交换的。
    • 我的意思是需要“手动”配置反向地图 - 基本上是我在答案中写的。
    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2017-02-14
    • 2020-12-12
    相关资源
    最近更新 更多