1 действие получить lastinsertedID для 2 вставок / добавок с EF - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть действие и 2 таблицы SQL. Я знаю, как ввести запись в 1 таблицу, но для второй таблицы я хочу получить последний вставленный идентификатор из таблицы 1 и вставить его во 2-ю таблицу для одного из столбцов.У меня все настроено, но сохранение базы данных не работает без исключения.Также я не уверен, как использовать scope_identity () или получить последний идентификатор, и я использую 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");
            }
        }

1 Ответ

0 голосов
/ 15 апреля 2019

Если два объекта связаны с одним и тем же 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 должен управлять вашими отношениями, чтобы ваш код просто работал со связанной структурой сущностей и передавал управление ключами / отношениями в Entity Framework.

Если вам нужны идентификаторы в контексте или для возврата после выполнения вставки, вы можете получить доступ к новому PK объекта сразу после вызова SaveChanges:

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