📜  Entity Framework-显式加载(1)

📅  最后修改于: 2023-12-03 14:40:59.388000             🧑  作者: Mango

Entity Framework - 显式加载

在Entity Framework中,显式加载是指在需要时手动加载与实体相关联的导航属性。它是延迟加载的一种补充,可以在需要时使用。

启用显式加载

要启用显式加载,需要将LazyLoadingEnabled设置为false,并使用以下代码来进行显式加载:

using (var context = new MyContext())
{
    var entity = context.Entities.Find(id);
    context.Entry(entity).Collection(e => e.Children).Load(); // 加载实体导航属性
}

在这个例子中,我们加载了一个名为Children的实体导航属性。这个属性必须在实体类中定义为virtual,以便它可以被重写,并允许EF框架为其创建代理。

显示加载策略

Load方法中,还可以使用一个可选参数来指定加载的策略。以下是一些可用的加载策略:

Query

使用Query策略时,将为导航属性生成一个新的数据库查询,并将其加载到上下文中。

context.Entry(entity).Collection(e => e.Children).Query().Include(c => c.Grandchildren).Load();

在这个例子中,我们加载了Children实体导航属性,并使用Query策略来将所有子级(孙级)数据加载到上下文中。

NoTracking

当使用NoTracking策略时,将不会将数据加入到上下文中。这对于只需读取数据的情况非常有用,而不必在上下文中保留数据。

context.Entry(entity).Collection(e => e.Children).Query().AsNoTracking().Load();

在这个例子中,我们加载了Children实体导航属性,并使用NoTracking策略来将数据加载到上下文之外,以便只读取数据。

LazyLoadingEnabled

LazyLoadingEnabled策略是EF默认实现的配置,当启用延迟加载时,将自动加载数据。

要使用这个策略,只需要启用延迟加载,并在需要时访问导航属性即可。

context.Configuration.LazyLoadingEnabled = true;
var entity = context.Entities.Find(id);
var children = entity.Children; // 这会自动加载数据
总结

显式加载是为了优化实体框架中的查询而存在的。当需要时手动加载导航属性时,它可以尽可能地减少所需的数据,从而提高查询性能。