ASP.NET MVC同一Action方法中插入并更新数据库行失效问题
解决ASP.NET MVC同一Action中插入+更新不生效的问题
嘿,我看了你的代码片段,大概率问题出在更新操作后没有再次调用db.SaveChanges(),另外还有几个可以优化的地方,帮你梳理下:
核心问题与修正方案
1. 遗漏第二次SaveChanges()
你插入数据后调用了一次SaveChanges(),但更新Student的UserId和IdeaId之后,没有把这个变更提交到数据库,所以更新不会生效。
2. 冗余的Max查询(还存在并发风险)
你现在用Max()去查询最新的ID,但其实EF在调用SaveChanges()后,插入的实体的主键(比如UserId、IdeaId)会自动被EF回填到实体对象中,完全不需要再查一遍Max!这不仅多余,还可能在高并发场景下拿到错误的ID(比如同时有另一个请求插入了数据)。
修正后的完整代码
if (ModelState.IsValid) { // 添加所有新实体到上下文 db.Users.Add(reg.users); db.Idea.Add(reg.idea); var newStudent = reg.students[0]; db.Students.Add(newStudent); // 第一次SaveChanges:提交插入操作,EF会自动回填实体的主键值 db.SaveChanges(); // 直接用已回填的主键设置关联,无需查询Max newStudent.UserId = reg.users.UserId; newStudent.IdeaId = reg.idea.IdeaId; // 第二次SaveChanges:提交更新操作 db.SaveChanges(); }
更简洁的优化方案(利用EF导航属性)
如果你的实体类定义了导航属性(比如Student类里有public User User { get; set; }和public Idea Idea { get; set; }),可以直接建立实体关联,EF会自动处理外键,甚至只需要一次SaveChanges():
if (ModelState.IsValid) { var newStudent = reg.students[0]; // 直接关联实体 newStudent.User = reg.users; newStudent.Idea = reg.idea; // 添加主实体,EF会自动添加关联的子实体 db.Students.Add(newStudent); // 一次SaveChanges完成所有插入和关联设置 db.SaveChanges(); }
这样代码更简洁,也避免了手动处理外键的麻烦。
内容的提问来源于stack exchange,提问作者Ahmed Mahmoud
相关产品推荐
相关产品推荐

