2011-12-23 207 views
3

我有兩個實體:Invoice和InvoiceDetail。實體框架:更新相關實體

發票有一個InvoiceDetails成員。

當我創建一個obcjet時,它按預期工作。

框架在數據庫中插入Invoice和InvoiceDetail行。

$.ajax({ 
    url: "/Invoices/Index", 
    data: JSON.stringify({ 
     InvoiceDetails: [{ 
      Description: "1" 
     }, { 
      Description: "2" 
     }] 
    }), 
    contentType: "application/json", 
    type: "POST" 
}); 

    [ActionName("Index")] 
    [HttpPost] 
    public JsonResult Post(Invoice invoice) 
    { 
     db.Invoices.AddObject(invoice); 
     db.SaveChanges(); 
     ... 

我還想更新Invoice和相關的InvoiceDetails。

$.ajax({ 
    url: "/Invoices/Index/1", 
    data: JSON.stringify({ 
     Id: 1, 
     InvoiceDetails: [{ 
      Id: 1, 
      Description: "1*" 
     }, { 
      Id: 2, 
      Description: "2*" 
     }] 
    }), 
    contentType: "application/json", 
    type: "PUT" 
}); 

    [ActionName("Index")] 
    [HttpPut] 
    public JsonResult Put(Invoice invoice) 
    { 
     db.Invoices.Attach(invoice); 
     db.ObjectStateManager.ChangeObjectState(invoice, EntityState.Modified); 
     db.SaveChanges(); 
     ... 

但框架只更新發票。

如何更新相關實體?

我的模型看起來像這樣

enter image description here

編輯:解 http://michele.berto.li/update-of-an-object-and-related-records-with-backbonejs-and-net-mvc

更新的鏈接 http://michele.berto.li/update-of-an-object-and-related-records-with-backbone-js-and-net-mvc/

回答

1

當您致電ChangeObjectState您正在更改單個實體的狀態,關係保持不變狀態。所以如果你只修改現有的發票細節,你可以簡單地迭代這些細節,並將它們設置爲修改狀態。如果您還可以添加或刪除詳細信息,那麼它將爲much more complicated,您將不得不手動將請求中的狀態與數據庫中的狀態同步(以@Hammerstein建議的形式首先從數據庫加載發票,然後使用一些約定來查找哪些詳細信息被設置爲刪除或添加狀態而不在數據庫中檢查它。

+0

我有一個控制器'HttpPost'操作,用於處理提交複雜表單的操作,該表單由一個實體及其導航屬性組成,這些屬性可以是由於刪除,某些新項目,某些修改而丟失的某些項目的集合,以及與單個對象導航相同。可以爲零的屬性(FK屬性可以爲空),修改爲新實體,修改現有或許多其他選項。有關如何管理EF中相關實體的統一方法?由於缺乏明確統一的方式來執行此類操作,整個事情開始變得混亂。 – Shimmy 2015-04-19 04:23:20

+0

關於2015年這個問題的任何消息?任何方式輕鬆更新整個圖形,包括刪除相關實體? – Shimmy 2015-04-19 22:18:42

0

我不附加太多的工作,通常我查詢數據庫,更新記錄和大改變。但我相信您所附的發票與發票明細沒有相同的關聯。您需要將該記錄取出,更新並保存更改。