使用工作单元模式结合Entity Framework获取最后插入行ID
解决工作单元模式下获取新增实体自增ID的问题
我来帮你解决这个问题——你现在拿不到正确自增ID的原因很明确:控制器里的cmt对象和服务层里实际插入数据库的Comment实例完全是两个独立的对象。EF只会更新被上下文跟踪的那个实体的ID,所以控制器里的cmt自然拿不到值。
核心解决方案
直接使用服务层CreateComment方法返回的Comment对象——这个对象是经过EF上下文持久化后的实例,已经包含了数据库生成的自增CommentId。
修改后的代码示例
控制器的Savecomment方法
public ActionResult Savecomment(string comment) { var user = (from a in _registrationService.GetAllRegistrations() where a.Email == Convert.ToString(Session["Email"]) select a).FirstOrDefault(); var userid = Convert.ToInt32(user.UserId); if (ModelState.IsValid) { Comment cmt = new Comment(); // 移除多余的无效赋值:自增列无需手动设置,EF会自动处理 // cmt.CommentId = cmt.CommentId; cmt.DateTime = System.DateTime.Now; cmt.PostId = Convert.ToInt32(TempData["pid"]); cmt.UserId = userid; cmt.Body = comment; // 接收服务层返回的已完成持久化的Comment对象 var createdComment = _commentService.CreateComment(cmt); var id = createdComment.CommentId; // 这里就能拿到正确的自增ID了 var res = _commentService.GetCommentById(id); return Json(res, JsonRequestBehavior.AllowGet); } return RedirectToAction("Index","Home"); }
可选优化:减少不必要的数据库查询
其实服务层已经返回了完整的、刚插入数据库的createdComment对象,你完全可以直接返回它,不需要再调用GetCommentById(id)做一次额外查询:
// 替换原有的查询和返回代码 return Json(createdComment, JsonRequestBehavior.AllowGet);
原理说明
在你的服务层CreateComment方法中:
- 你创建了一个新的
Comment实例并通过仓储添加到EF上下文 - 调用
_unitOfWork.Save()时,EF执行SaveChanges(),此时数据库生成自增ID并同步到这个被上下文跟踪的Comment实例 - 方法最后返回这个实例,它的
CommentId已经是数据库生成的有效值
这样控制器拿到的就是正确的ID了。
内容的提问来源于stack exchange,提问作者Sachin Singh
相关产品推荐
相关产品推荐

