【发布时间】: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);
}
谢谢, 贾斯汀
【问题讨论】: