具有互惠导航属性的自动映射器

时间:2017-04-21 02:22:39

标签: entity-framework automapper entity-framework-core

需要一些帮助。 我有几个类,我试图使用Automapper映射。我正在使用EF核心。 基本域是这样的:

Public class A 
{
  public string Id {get; set;}
  public string Name {get; set;}
  public virtual Icollection<AB> AB {get; set;} 
}

Public class B 
{
  public string Id {get; set;}
  public string Name {get; set;}
  public virtual ICollection<AB> AB {get; set;} 
}

Public class AB 
{
  public string A_Id {get; set;}
  public string B_Id {get; set;}
  public virtual A A {get; set;} 
}

我的DTO是这样的:

Public class A_DTO 
{
  public string Id {get; set;}
  public string Name {get; set;}
  public ICollection<B> Bs {get; set;} 
}

Public class B_DTO 
{
  public string Id {get; set;}
  public string Name {get; set;}
  public ICollection<A> As {get; set;} 
}

现在我遇到的问题是:

  1. 如何设置映射,以便Automapper自动检索子项列表(例如当前“A”的相关“B”)
  2. 如何配置我的DTO,例如,为'A'检索的'B'不会公开'A的导航属性以防止无限递归。
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

我知道这是一个古老的问题,但希望这有助于某人。

你可以这样调用Automapper的 ResolveUsing 方法:

ExtendWith

在RemoveInclusions方法中,您可以手动将A&#39的导航设置为null,如:

cfg.CreateMap<A, A_DTO>()
 .ForMember(x => x.Bs,
 opt => opt.ResolveUsing(src => RemoveInclusions(src)));

答案 1 :(得分:0)

部分答案在这里。我正在研究并偶然发现https://www.exceptionnotfound.net/entity-framework-and-wcf-loading-related-entities-with-automapper-and-reflection/

所以当DTO不是主体时删除导航属性我改变了我的DTO。

CreateMap<A, A_DTO>();
CreateMap<A, A_Nav_DTO>()
  .ForMember(dto => dto.B, map => 
      map.MapFrom(model => 
          model.AB.Select(ab => ab.B).ToList()));

在我的映射中我做了

$(document).ready( function() {
  $('#example').dataTable( {
    "oSearch": {"sSearch": "Initial search"}
  } );
} )

现在这可行,但显然现在我必须映射三个类而不是两个。有关如何改进此解决方案的任何建议吗?