启用 EF Core 延迟加载需安装 Microsoft.EntityFrameworkCore.Proxies 包,实体导航属性标记为 virtual,并在 DbContext 配置中调用 UseLazyLoadingProxies(),即可实现访问时自动加载关联数据。

在 C# 中使用 EF Core 的延迟加载(Lazy Loading),需要通过配置代理来实现。延迟加载意味着导航属性在首次访问时才从数据库中加载,而不是在主查询时一并加载。
启用延迟加载的前提条件
要使用延迟加载代理,必须满足以下几点:
- 导航属性必须是 virtual
- 需要安装 EF Core 的延迟加载代理 NuGet 包
- 在 DbContext 配置中启用延迟加载
1. 安装延迟加载代理包
Install-Package Microsoft.EntityFrameworkCore.Proxies这是 EF Core 官方提供的代理生成包,用于支持延迟加载功能。
2. 实体类中定义 virtual 导航属性
确保你的导航属性(如集合或引用类型)标记为 virtual,这样代理才能重写它们以实现延迟加载。
public class Blog{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
3. 在 DbContext 中启用代理和延迟加载
在 OnConfiguring 或 Startup.cs(ASP.NET Core)中配置上下文时,使用 UseLazyLoadingProxies() 方法。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){
optionsBuilder
.UseSqlServer("YourConnectionString")
.UseLazyLoadingProxies(); // 启用延迟加载代理
}
如果你使用依赖注入(如 ASP.NET Core),可以在 Program.cs 或 Startup.cs 中这样配置:
builder.Services.AddDbContextoptions.UseSqlServer(connectionString)
.UseLazyLoadingProxies());
4. 使用示例
现在你可以像平常一样查询实体,导航属性会在访问时自动加载。
using var context = new YourContext();var blog = context.Blogs.FirstOrDefault(b => b.Id == 1); // 此时不会加载 Posts
// 当访问 Posts 时,才会触发数据库查询
foreach (var post in blog.Posts)
{
Console.WriteLine(post.Title);
}
注意事项
- 延迟加载可能引发性能问题(N+1 查询),在循环中频繁访问导航属性时要小心
- 如果上下文已释放(Disposed),再访问导航属性会抛出异常
- 延迟加载不适用于静态属性或非 virtual 属性
- 在序列化对象(如返回 JSON)时,注意避免意外触发加载或循环引用
基本上就这些。只要装对包、设对 virtual、开对选项,EF Core 的延迟加载代理就能自动工作。









