Entity Framework Core执行插入后数据库无变更问题排查
问题分析与解决方案
核心问题:异步方法未等待
你调用_context.SaveChangesAsync()时没加await关键字,导致异步操作还没执行完,代码就继续往下走了——EF Core的事务根本没提交,所以数据库里看不到任何变更。
修复代码
把方法改成异步的,并且等待SaveChangesAsync执行完成:
public async Task AddMultipleChoiceFiller(List<MultipleChoiceFillerModel> multipleChoiceFiller) { // 先查一次目标问题,避免循环里重复查库 var targetQuestion = GetMultipleChoiceById(1222); multipleChoiceFiller.ForEach(filler => filler.MultipleChoiceModel = targetQuestion); _context.MultipleChoiceFillers.AddRange(multipleChoiceFiller); try { await _context.SaveChangesAsync(); // 必须加await等待异步操作完成 } catch (Exception ex) { Console.WriteLine(ex.ToString()); // 打印完整异常信息,方便排查 } }
其他优化与检查点
- 减少重复数据库查询:原来的循环里每次都调用
GetMultipleChoiceById(1222),会执行3次相同的SQL。先查一次目标Question再批量赋值,能降低数据库压力。 - 显式配置外键:虽然EF Core能自动推断外键,但显式添加外键属性可以避免歧义:
public class MultipleChoiceFillerModel { [Key] public int FillerId { get; set; } public string Filler { get; set; } = string.Empty; // 显式声明外键字段 public int? MultipleChoiceModelQuestionId { get; set; } public MultipleChoiceModel? MultipleChoiceModel { get; set; } } - 检查查询返回值:如果
QuestionId=1222的记录不存在,FirstOrDefault()会返回null,此时外键会被设为null。建议加空值检查,避免意外情况:public MultipleChoiceModel GetMultipleChoiceById(int id) { var question = _context.MultipleChoices .FirstOrDefault(i => i.QuestionId == id); if (question == null) { throw new ArgumentException($"找不到QuestionId为{id}的记录"); } return question; } - 验证DbContext生命周期:确保
_context的作用域正确(比如ASP.NET Core里用Scoped生命周期),避免上下文被提前释放导致操作失败。
内容的提问来源于stack exchange,提问作者AbdulRahman Alduraiweesh
相关产品推荐
相关产品推荐

