使用集合

时间:2017-05-16 14:06:05

标签: c# entity-framework automapper

我有一个对象,我们称之为Parent,其中包含Sons和Daughters的集合。

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; }
}

让我们假设有来回映射的Model类和Data类。

 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();
}

我忽略了每个Son和Daughter上的Parent,然后将Parent映射到Parent的AfterMap中的每个Son和Daughter。这就是我在设置它的一个例子中所做的工作。

我可以拉一个父母,儿子和女儿的收藏回来了,我可以使用它们所有这些,这就是我想要的。我可以拉儿子或女儿,父母回来。

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

当我拉数据时,精确映射Data.Parent =&gt; Models.Parent ......那么为什么失败?

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

1 个答案:

答案 0 :(得分:1)

您需要在反向地图(模型 - &gt;数据)中配置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()); }); 成员的方式与数据相同 - &gt;模型图:

jQuery(document).ready(function($) {
  jQuery('.woocommerce-product-gallery__image img').click(function(e) {
    e.preventDefault();
    var src = jQuery(this).attr('src');
    var srcset = jQuery(this).attr('srcset');
    var alt = jQuery(this).attr('alt');
    alert(srcset);
    jQuery('.images .zoom .wp-post-image').attr('src', src);
    jQuery('.images .zoom .wp-post-image').attr('srcset', srcset);
    jQuery('.images .zoom .wp-post-image').attr('alt', alt);
  });
});