【问题标题】:Entity Framework - How to save child entities实体框架 - 如何保存子实体
【发布时间】:2010-06-13 17:51:19
【问题描述】:

我正在使用 .NET 4 EF 并尝试保存实体 (Invoice) 的子实体 (InvoiceLogs)。在提交表单时,我有一个分离的发票对象,其中包含已修改的 InvoiceLog 实体的 EntityCollection 传递给我的控制器操作。然后我将发票附加到数据上下文并调用 SaveChanges。问题是这只保存 Invoice,它不保存修改后的 InvoiceLog 实体。如果我尝试单独附加 InvoiceLog 实体,则会出现以下错误:

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。

如何在 EF 4 中保存子实体??

//POST: /Secure/Invoices/SaveHours/
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult SaveHours([Bind(Exclude = "InvoiceLogs")]Invoice invoice)
        {
            TryUpdateModel(invoice.InvoiceLogs, "InvoiceLogs");
            invoice.UpdateDate = DateTime.Now;
            invoice.DeveloperID = Developer.DeveloperID;
            //attaching existing invoice.
            DataContext.InvoiceData.Attach(invoice);
            //attach invoice hours.
            foreach (var log in invoice.InvoiceLogs)
            {
                DataContext.InvoiceData.AttachLog(log);
            }
            //save changes.
            DataContext.SaveChanges();
            //redirect to invoice list.
            return RedirectToAction("Index");
        }

public static void Attach(Invoice invoice)
            {
                var i = new Invoice { InvoiceID = invoice.InvoiceID };
                db.Invoices.Attach(i);
                db.Invoices.ApplyCurrentValues(invoice);
            }

            public static void AttachLog(InvoiceLog log)
            {
                var i = new InvoiceLog { InvoiceLogID = log.InvoiceLogID };
                db.InvoiceLogs.Attach(i);
                db.InvoiceLogs.ApplyCurrentValues(log);
            }

谢谢, 贾斯汀

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    搞定了,我需要在隐藏字段中填充 InvoiceLogID 和 InvoiceID,以便将它们填充到 EntityCollection 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多