C#中如何使用EF Core的查询延迟加载代理?如何启用?

来源:这里教程网 时间:2026-02-21 17:27:51 作者:

在 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 Posts { get; set; } = new List();
}

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 中启用代理和延迟加载

OnConfiguringStartup.cs(ASP.NET Core)中配置上下文时,使用 UseLazyLoadingProxies() 方法。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer("YourConnectionString")
        .UseLazyLoadingProxies(); // 启用延迟加载代理
}

如果你使用依赖注入(如 ASP.NET Core),可以在 Program.csStartup.cs 中这样配置:

builder.Services.AddDbContext(options =>
    options.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 的延迟加载代理就能自动工作。

相关推荐