📅  最后修改于: 2023-12-03 14:40:59.388000             🧑  作者: Mango
在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; // 这会自动加载数据
显式加载是为了优化实体框架中的查询而存在的。当需要时手动加载导航属性时,它可以尽可能地减少所需的数据,从而提高查询性能。