我一直在使用AutoMapper,它似乎让我获得了所有子实体(即使我没有在“Include()”子句中指定它们)。是否有任何方法可以使延迟加载成为可能,并且只有在我指定它们时才获取子属性。
谢谢,
的Jakub
答案 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..
}