2016-02-20 44 views
0

我有以下兩個FK關係表。將兩個FK關係表插入一個UoW?

create table A { Id int primary key identity(1,1), ... } 
create table B { AId int reference A(Id), ....} 

現在我需要在一個添加一行,然後添加B中的另一行,將引用A.新行的Id是否有可能做到這一點在使用EF 6一個工作單元?但是,在調用SaveChanges()之前,A的Id將不可用?兩個插入物必須分開?

回答

1

當然。

只有在通過外鍵基元值添加相關實體時,您才需要多個SaveChange。

如果您只想使用一個SaveChanges,請添加填充了相關實體的根實體。 (不只是外鍵,整個相關的實體對象)

var tableAEntity = new TableAEntity 
{ 
// set tableA fields 
// Name = "blah", 

// now set the TableB navigation property reference 
TableBEntityField = new TableBEntity 
        { 
         // table B fields 
        } 
}; 

context.TableAEntities.Add(tableAEntity); 
context.SaveChanges(); 

另外,我不想從手頭上的問題,讓你分心。(和人民始終遵循一些分散注意力的理論陳述。 。所以這裏:) :)

工作模式的單位並不意味着,你不應該有多個SaveChanges或任何東西。 我發現它實際上將上下文抽象爲一個UOW包裝並不那麼直觀和多餘,尤其是首先使用EF 6代碼。相反,我更喜歡我的業務層管理器/操作類有上下文注入和方法,只是根據需要對其執行多個SaveChanges。 (其間沒有UOW包裝)

最終,重要的是您的業務層中的CustomerManager或CustomerOperation具體類接收客戶域模型並將其添加到數據庫內部。調用者關閉一個接口ICustomerManager/ICustomerOperation/ICustomerRepository等,並不知道具體的類如何做持久化..可能是EF DataContext,LINQ2SQL,ADO.NET等。在這種情況下,具體的類方法可以決定做多個SaveChanges或跨越交易等。我發現這個選項更容易預測,通過保存一個實體,然後用FK Id等保存另一個實體。

正如我所說,可能對UOW有不同意見:),所以選擇適合您的空間的解決方案。

+0

如果表B在兩個或多個具有標識列的表上有外鍵引用? – ca9163d9

+0

如果還有2個表記錄也作爲此方法的一部分創建,那麼只需重複該模式即可。tablebentity = new tablebentity {tablec = new tablec,tabled = new tabled} etc ...如果2個表記錄已經在數據庫中,那麼你需要單獨閱讀它們,並在tablebentity記錄上設置FK。正如我所說,如果它太複雜或容易出錯(嵌套實體對我來說很棘手),它絕對是可以做多個保存更改.. –