You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 Blazor Server中EF Core DbContext注入为空及工厂适配方案

问题解决方案

一、修复AddDbContext模式下注入为空的问题

1. 修正注入类名拼写错误

你的Razor代码中注入的类名少了一个字母n,正确写法应为:

@inject ApplicationDbContext myContext

2. 确认Program.cs中的DbContext配置

确保AddDbContext的配置正确指向Cosmos数据库,示例代码:

builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseCosmos(
        connectionString: "你的Cosmos DB连接字符串",
        databaseName: "目标数据库名称"
    );
});

Blazor Server中默认AddDbContext的生命周期为Scoped,与组件生命周期匹配,无需额外指定。

3. 组件内正确使用DbContext

组件方法需遵循异步规范(EF Core操作建议用异步方法),且避免在组件构造函数中直接操作DbContext(建议在OnInitializedAsync或点击事件等触发点调用):

@code {
    private async Task AddEntityAsync()
    {
        // 示例:添加实体并保存
        var newEntity = new YourEntity { /* 赋值属性 */ };
        myContext.Add(newEntity);
        await myContext.SaveChangesAsync();
    }
}

二、切换为AddDbContextFactory的适配方案

在Blazor Server场景中,使用DbContextFactory可以更灵活地管理DbContext实例的创建与释放,避免长期持有Scoped实例带来的问题。

1. 替换Program.cs中的服务注册

将AddDbContext替换为AddDbContextFactory:

builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
{
    options.UseCosmos(
        connectionString: "你的Cosmos DB连接字符串",
        databaseName: "目标数据库名称"
    );
}, ServiceLifetime.Scoped); // 推荐使用Scoped生命周期适配Blazor组件

2. 组件内注入并使用DbContextFactory

在Razor组件中注入IDbContextFactory<ApplicationDbContext>,并按需创建DbContext实例(务必用using包裹以自动释放):

@inject IDbContextFactory<ApplicationDbContext> dbContextFactory

@code {
    private async Task AddEntityAsync()
    {
        using var myContext = dbContextFactory.CreateDbContext();
        
        var newEntity = new YourEntity { /* 赋值属性 */ };
        myContext.Add(newEntity);
        await myContext.SaveChangesAsync();
    }
}

注意事项

  • 每次调用CreateDbContext()都会生成新的DbContext实例,使用using可确保实例在操作完成后被正确释放。
  • 确保ApplicationDbContext的构造函数为public,并接受DbContextOptions<ApplicationDbContext>参数:
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
        
        // 定义DbSet<YourEntity> YourEntities { get; set; }
    }
    

内容的提问来源于stack exchange,提问作者AndyW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:18:17