Blazor Server中SQL Server的Agency表数据保存不生效求助
问题排查与修复方案
核心问题1:异步操作未正确等待
你的AddUsers和AddAgency方法为同步void类型,但内部调用了EF Core的异步方法SaveChangesAsync()却未等待操作完成。当using块执行结束时,DbContext会被立即释放,此时异步保存操作可能还未完成,直接导致数据无法写入数据库。
核心问题2:存在性判断逻辑错误
你用来检查重复的逻辑完全偏离需求:
var userId = ctx.Users.FirstOrDefault(x => x.UserId == null);
这段代码是查询表中是否存在UserId为null的记录,而非检查你要添加的users.UserId是否已存在于表中。Agency的判断逻辑同理,这会导致重复检查完全失效,甚至可能在不该抛出异常时触发异常。
修复步骤
将方法改为异步类型
把void改为async Task,并通过await关键字等待异步操作完成。修正存在性判断逻辑
改为检查传入实体的ID是否已存在于数据库中。补充异常处理(可选但推荐)
捕获EF Core可能抛出的主键冲突、约束违反等异常,方便排查问题。
修复后的代码示例
using BlazorProject.Data.Models; using Microsoft.EntityFrameworkCore; namespace BlazorProject.ServiceController { public class AdminController { private readonly IDbContextFactory<DbContextLayer> _dbContextFactory; public AdminController(IDbContextFactory<DbContextLayer> dbContextFactory) { _dbContextFactory = dbContextFactory; } // 用户注册 public async Task AddUsersAsync(Users users) { using (var ctx = _dbContextFactory.CreateDbContext()) { // 检查要添加的用户ID是否已存在 var existingUser = await ctx.Users.FirstOrDefaultAsync(x => x.UserId == users.UserId); if (existingUser == null) { ctx.Users.Add(users); await ctx.SaveChangesAsync(); } else { throw new Exception("用户ID已存在!"); } } } // 添加机构 public async Task AddAgencyAsync(Agency agency) { using (var ctx = _dbContextFactory.CreateDbContext()) { // 检查要添加的机构ID是否已存在 var existingAgency = await ctx.Agency.FirstOrDefaultAsync(x => x.AgencyId == agency.AgencyId); if (existingAgency == null) { ctx.Agency.Add(agency); await ctx.SaveChangesAsync(); } else { throw new Exception("机构ID已存在!"); } } } } }
额外注意事项
- 调用这些方法的Blazor组件代码也需要改为异步调用,例如:
await adminController.AddAgencyAsync(agency); - 确认
Agency实体的AgencyId配置正确:如果是自增主键,需确保EF Core已配置[Key]和[DatabaseGenerated(DatabaseGeneratedOption.Identity)],此时无需手动设置ID,由数据库自动生成,存在性判断可改为检查其他唯一字段(如机构名称)。
内容的提问来源于stack exchange,提问作者Cheche Acebido
相关产品推荐
相关产品推荐

