Я использую.NET 4 EF и пытаюсь сохранить дочерние объекты (InvoiceLogs) объекта (Счет). На форме утверждают, что у меня есть отдельный объект счета, который имеет EntityCollection измененных объектов InvoiceLog, переданных моему действию контроллера. Я затем присоединяю счет к контексту данных и называю SaveChanges. Проблема состоит в том, что это только сохраняет Счет, он не сохраняет измененные объекты 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);
}
Спасибо, Justin
Все заработало, мне нужно было заполнить InvoiceLogID и InvoiceID в скрытых полях, чтобы они попали в EntityCollection.