Entity Framework - Сохранение дочерних объектов при обновлении - PullRequest
2 голосов
/ 10 июля 2010

У меня есть объект Invoice, и у него есть дочерние объекты InvoiceLog. Когда я впервые создаю Invoice, добавляю его сущности InvoiceLog и сохраняю, он работает нормально. Однако если я затем отредактирую Invoice и попытаюсь добавить дополнительные объекты InvoiceLog, он полностью игнорирует новые объекты InvoiceLog и не сохраняет их вообще. Есть идеи, что я делаю не так?

//POST: /Secure/Invoices/Save/
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Save(Invoice invoice)
        {
            invoice.UpdateDate = DateTime.Now;
            invoice.DeveloperID = Developer.DeveloperID;
            invoice.InvoiceStatusID = (int)Enums.InvoiceStatus.Open;
            if (invoice.InvoiceID == 0)
            {//inserting new invoice.
                DataContext.InvoiceData.Insert(invoice);
            }
            else
            {//attaching existing invoice.
                DataContext.InvoiceData.Attach(invoice);
            }
            AddHours(invoice);
            //save changes.
            DataContext.SaveChanges();
            //redirect to invoice list.
            return RedirectToAction("Index");
        }

        private void AddHours(Invoice invoice)
        {
            //get existing logs.
            IQueryable<InvoiceLog> existingLogs = null;
            if(invoice.InvoiceID > 0)
            {
                existingLogs = DataContext.InvoiceData.GetLogs(invoice.InvoiceID);
            }
            //create new logs.
            var numDays = invoice.EndDate.Subtract(invoice.StartDate).TotalDays;
            for (int k = 0; k <= numDays; k++)
            {
                //check if log already exists.
                var existingLog = existingLogs.ToList().FindIndex(l => l.LogDate == invoice.StartDate.AddDays(k));
                if (existingLog == -1)
                {
                    //add new log.
                    var log = new InvoiceLog();
                    log.CreateDate = DateTime.Now;
                    log.UpdateDate = DateTime.Now;
                    log.Hours = 0;
                    log.InvoiceID = invoice.InvoiceID;
                    log.LogDate = invoice.StartDate.AddDays(k);
                    invoice.InvoiceLogs.Add(log);
                }
            }
        }

Спасибо, Джастин

1 Ответ

0 голосов
/ 11 июля 2010

Вы можете попробовать добавить InvoiceLogs элементов перед прикреплением invoice:

    else
    {//attaching existing invoice.
        AddHours(invoice);
        DataContext.InvoiceData.Attach(invoice);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...