You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用工作单元模式结合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方法中:

  1. 你创建了一个新的Comment实例并通过仓储添加到EF上下文
  2. 调用_unitOfWork.Save()时,EF执行SaveChanges(),此时数据库生成自增ID并同步到这个被上下文跟踪的Comment实例
  3. 方法最后返回这个实例,它的CommentId已经是数据库生成的有效值

这样控制器拿到的就是正确的ID了。

内容的提问来源于stack exchange,提问作者Sachin Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:19:21