.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
相关产品推荐
相关产品推荐

