【问题标题】:1 Action get lastinsertedID for 2 inserts/adds with EF1 操作获取 lastinsertedID 以使用 EF 进行 2 次插入/添加
【发布时间】:2019-09-04 22:49:20
【问题描述】:

我有一个操作和 2 个 SQL 表,我知道如何将记录输入到 1 个表中,但是对于第二个表,我想从表 1 中获取最后插入的 ID,并将其插入到其中一列的第二个表中。我已经完成了所有设置,但我的数据库保存无法正常工作。另外我不确定如何使用 scope_identity() 或获取最后一个 ID,我正在使用 EF 处理所有内容。

public ActionResult AddTimeSheet()
        {
            ViewBag.ProjectsSelect = new SelectList(
                context.Projects.ToList(), "ProjectId", "ProjectName");

            var uid = User.Identity.GetUserId();
            ViewBag.CurrentId = uid;

            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult AddTimeSheet(TimeSheetProjectsModel timeSheetModel)
        {
            try
            {
                if(timeSheetModel == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                //if (ModelState.IsValid)
                //{
                    TimeSheetMaster masterModel = new TimeSheetMaster();
                    masterModel.FromDate = timeSheetModel.Proj1;
                    masterModel.ToDate = timeSheetModel.Proj1.AddDays(7);
                    /* NEED HRS 4 WEEK/END MONTH/NEW MONTH */

                    masterModel.TotalHours = timeSheetModel.ProjTotal1;
                    masterModel.UserId = User.Identity.GetUserId();
                    masterModel.DateCreated = DateTime.Now;
                    /* MONTH SUBMITTED */

                    masterModel.TimeSheetStatus = 1;
                    masterModel.Comment = timeSheetModel.ProjDesc1;
                    context.TimeSheetMaster.Add(masterModel);

                    var detailsModel = CreateTimeSheetDetails(masterModel, timeSheetModel);
                    context.TimeSheetDetails.Add(detailsModel);
                    context.SaveChanges();

                    TempData["SuccessMaster"] = "TimeSheetMaster Created Successfully";
                    TempData["SuccessDetails"] = "TimeSheetDetails Created Successfully";
                    return RedirectToAction("TimeSheetList", "TimeSheet");
                //}
               // TempData["Error"] = "TimeSheet Create Was Unsuccessful";
               // return RedirectToAction("TimeSheetList", "TimeSheet");
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                TempData["Error"] = "TimeSheet Create Was Unsuccessful";
                return RedirectToAction("TimeSheetList", "TimeSheet");
            }
        }

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-5 identity


    【解决方案1】:

    如果两个实体与同一个 DbContext 关联并且它们直接相关(PK/FK),那么最好的解决方案是确保实体具有为关系设置的导航属性并让 EF 管理键和链接。

    例如:

    TimeSheetMaster masterModel = new TimeSheetMaster();
    masterModel.FromDate = timeSheetModel.Proj1;
    masterModel.ToDate = timeSheetModel.Proj1.AddDays(7);
    masterModel.TotalHours = timeSheetModel.ProjTotal1;
    masterModel.UserId = User.Identity.GetUserId();
    masterModel.DateCreated = DateTime.Now;
    masterModel.TimeSheetStatus = 1;
    masterModel.Comment = timeSheetModel.ProjDesc1;
    
    var detailsModel = CreateTimeSheetDetails(masterModel, timeSheetModel);
    // either here, or inside CreateTimeSheetDetails...
    // if Master has a collection of Details: (1-to-Many)
    masterModel.Details.Add(details);
    // or if Master has a 1-to-1 relationship to details.
    // masterModel.Details = detailsModel;
    
    context.TimeSheetMaster.Add(masterModel);
    
    context.SaveChanges();
    

    理想情况下,EF 应该管理您的关系,以便您的代码可以简单地与相关实体结构一起使用,并将密钥/关系管理交给实体框架。

    如果您需要跨上下文的ID,或者在执行插入后返回,那么您可以在调用SaveChanges后直接访问实体的新PK:

    context.TimeSheetMaster.Add(masterModel);
    context.SaveChanges();
    var newId = masterModel.TimeSheetMasterId; // Populated automatically after SaveChanges.
    

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多