自动播放器是否可以防止EF延迟加载?

时间:2013-07-24 05:34:33

标签: entity-framework lazy-loading automapper

我一直在使用AutoMapper,它似乎让我获得了所有子实体(即使我没有在“Include()”子句中指定它们)。是否有任何方法可以使延迟加载成为可能,并且只有在我指定它们时才获取子属性。

谢谢,

的Jakub

2 个答案:

答案 0 :(得分:8)

映射后,您将拥有映射对象,而不对源实体(其中包含延迟加载的数据库上下文)的任何引用。仅将属性值复制到目标实体。所以如果没有源实体,你将无法进行任何延迟加载。

实际上,延迟加载对您来说很合适 - 并且它在映射过程中发生。您为实体的延迟加载属性指定了映射,mapper尝试获取这些值。这导致延迟加载您为映射配置的所有导航属性。这是非常低效的。要在映射期间禁用延迟加载,您可以忽略映射配置中的导航属性。例如。如果您的客户使用延迟加载订单:

Mapper.CreateMap<Customer, CustomerDto>()
      .ForMember(s => s.Orders, m => m.Ignore());

或从目标实体Orders中删除CustomerDto属性。如果您需要在CustomerDto实例中包含订单,那么最好的选择是切换订单,以避免其他查询。

答案 1 :(得分:3)

我认为最好的方法是根据需要定义映射对象。在映射对象中只定义所需的子实体。让我们说一些像这样的DTO映射到域中的Person实体。

class PersonDto
{
  public string Name{get;set;}
  public PersonLiteDto Parent{get; set;}
}

class PersonLiteDto
{
  public string Name{get;set;}
  //no navigation properties here..
}