2014-11-20 129 views
1

我需要更新一個實體,該實體有兩個孩子,這兩個孩子也有兩個孩子,這兩個孩子都依賴父母。保存大型實體和子實體框架

      Job(PK: Jobid) 
     Holes(PK: Holeid, FK: Jobid)/Orders(PK: Orderid, FK: Jobid) 
Tools(PK: Toolid, FK: Holeid, FK: Orderid)/ToolHoles(PK: Holeid, Orderid) 

工具還有7個孩子從它繼承。

作業在保存時已經存在。這項工作可能已經或可能不會包含每個子實體的一個或多個。

我需要能夠保存所有這些信息在一個事務中,使部分信息沒有保存到數據庫中。

我目前的嘗試已經建立起來的工作實體的所有相關信息和呼叫的SaveChanges。如果我添加新實體,則除了Jobid之外,所有密鑰都必須在保存時生成。我正試圖完成什麼?

+1

如果你問「EF是否跟蹤新密鑰並適當地更新孩子」,那麼答案是「是」 – MikeH 2014-11-20 21:07:14

+0

即使孩子會從父母雙方獲得新密鑰嗎? – user3738893 2014-11-20 21:15:57

回答

1

這裏製作的一些假設,讓我知道如果我是關閉基地。如果你的場景如下圖所示,那麼你應該沒問題。

var myHoles = new Holes(); 
var myOrders = new Orders(); 
var myTools = new Tools(); 
var myToolHoles = new ToolHoles(); 

myJob.Holes.Add(myHoles); //myJob already exists 
myJob.Orders.Add(myOrders); 

myHoles.Tools.Add(myTools); 
myOrders.Tools.Add(myTools); 

myHoles.ToolHoles.Add(myToolHoles); 
myOrders.ToolHoles.Add(myToolHoles); 

db.SaveChanges(); 

你說「一筆交易」,但現實是有幾筆交易發生。

  • myHolesmyOrders將被插入到數據庫中與它們JobId適當設定。
  • EF會發現它們的ID是什麼
  • myToolsmyToolHoles將與HoleIdOrderId組在第二步中的值插入。
+1

當然你也可以用'using'包裝你的代碼,並使用'BeginTransaction()'''Commit()'和'Rollback()'。 – 2014-11-20 21:32:00

+0

所以我需要將工具/工具孔映射到孔和訂單?我之前嘗試過,並且發現有關發現衝突更改的錯誤。 – user3738893 2014-11-20 21:59:53

+0

那麼他們現在如何關聯? – MikeH 2014-11-20 22:20:57