我有以下兩個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
將不可用?兩個插入物必須分開?
我有以下兩個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
將不可用?兩個插入物必須分開?
當然。
只有在通過外鍵基元值添加相關實體時,您才需要多個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有不同意見:),所以選擇適合您的空間的解決方案。
如果表B在兩個或多個具有標識列的表上有外鍵引用? – ca9163d9
如果還有2個表記錄也作爲此方法的一部分創建,那麼只需重複該模式即可。tablebentity = new tablebentity {tablec = new tablec,tabled = new tabled} etc ...如果2個表記錄已經在數據庫中,那麼你需要單獨閱讀它們,並在tablebentity記錄上設置FK。正如我所說,如果它太複雜或容易出錯(嵌套實體對我來說很棘手),它絕對是可以做多個保存更改.. –