Blazor表单提交EF Core存空值+DbContext并发异常求助
Blazor表单提交字段空值与DbContext并发异常解决办法
一、解决DbContext并发异常
问题核心是Blazor Scoped生命周期下,同一DbContext实例被多个异步操作同时调用,EF Core不允许这种行为。按以下步骤修复:
- 替换DbContext注册方式:在Program.cs中,将
AddDbContext改为AddDbContextFactory,示例:builder.Services.AddDbContextFactory<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("YourConnString"))); - 在组件中通过工厂创建独立DbContext实例:
@inject IDbContextFactory<YourDbContext> DbContextFactory @code { private async Task LoadInitialData() { using var db = DbContextFactory.CreateDbContext(); // 执行查询操作,比如 var data = await db.Entities.ToListAsync(); } private async Task HandleSubmit() { using var db = DbContextFactory.CreateDbContext(); // 执行提交操作 } } - 所有数据库操作必须在
using块内使用工厂创建的实例,确保每个操作独占一个DbContext。
二、解决表单提交字段为空值的问题
预设值能存入说明DbContext写入逻辑没问题,问题出在数据绑定或模型处理:
- 检查双向绑定是否正确:必须用
@bind-*绑定表单控件到模型属性,且EditForm要绑定到正确的模型实例:<EditForm Model="@formModel" OnValidSubmit="@HandleSubmit"> <InputText @bind-Value="@formModel.Username" /> <InputEmail @bind-Value="@formModel.Email" /> <button type="submit">提交</button> </EditForm> @code { private UserFormModel formModel = new(); // 初始化模型,不要在提交时重新创建 } - 确保模型属性具备读写权限:模型类的属性必须包含
get和set访问器,不能是只读:public class UserFormModel { public int Id { get; set; } public string Username { get; set; } = string.Empty; // 建议初始化避免null public string Email { get; set; } = string.Empty; } - 验证提交时模型值是否正确:在
HandleSubmit方法开头打印模型属性值,确认用户输入是否已经绑定到模型,排除验证逻辑导致的提交中断。 - 避免意外重置模型:不要在提交方法或生命周期钩子中重新实例化模型,否则会清空用户输入。
额外排查建议
- 确认实体与数据库表的映射:检查Fluent API或数据注解是否配置正确,确保属性与表字段一一对应。
- 页面初始化时异步操作要串行执行:如果有多个初始化数据加载,用
await依次执行,避免同时触发多个DbContext操作。
内容的提问来源于stack exchange,提问作者Ho Sung Choi
相关产品推荐
相关产品推荐

