我一直在使用 AutoMapper,它似乎让我获得了所有子实体(即使我没有在“Include()”子句中指定它们)。有什么方法可以使延迟加载成为可能并仅在我指定子属性时才获取子属性。
谢谢,
雅库布
我一直在使用 AutoMapper,它似乎让我获得了所有子实体(即使我没有在“Include()”子句中指定它们)。有什么方法可以使延迟加载成为可能并仅在我指定子属性时才获取子属性。
谢谢,
雅库布
映射后,您将映射对象而不引用源实体(它保存用于延迟加载的数据库上下文)。只有属性值被复制到目标实体。因此,如果没有源实体,您将无法进行任何延迟加载。
实际上,延迟加载对您来说很好 - 它发生在映射过程中。您为实体的延迟加载属性指定了映射,并且映射器尝试获取这些值。这会导致延迟加载您为映射配置的所有导航属性。这是非常低效的。要在映射期间禁用延迟加载,您可以忽略映射配置中的导航属性。例如,如果您有客户延迟加载订单:
Mapper.CreateMap<Customer, CustomerDto>()
.ForMember(s => s.Orders, m => m.Ignore());
或Orders
从您的目标实体中删除属性CustomerDto
。如果您需要CustomerDto
内部有订单的实例,那么最好的选择是预先加载订单,以避免额外的查询。
我认为最好的方法是根据您的需要定义映射对象。在映射对象中仅定义所需的子实体。假设某些 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..
}