我有了很多表,這將需要一個地址的項目引用:實體框架6,表到多個其他表
- 客戶
- 訂購
- 供應商
- ...很多更多。
取而代之的是CustomerAddress,OrderAddress和VendorAddress表,我們試圖用這樣一個共同的地址表:
AddressId (PK, int, identity, not null)
AddressType (int, not null, poss values: Customer, Order, Vendor, etc..)
ForeignKeyId (int, not null)
Name
Street
City
etc...
與客戶表:
CustomerId (PK, int, identity, not null)
...other customer information...
在哪裏如果我有一個客戶(CustomerId = 56),可能會有像這樣的地址記錄:
AddressId (some number)
AddressType = 1 (Customer)
ForeignKeyId = 56
Name, Street, City
這一切都很好。
但是,當我去添加一個新的客戶到系統時,問題出現了。在EF中,我認爲這意味着我必須添加客戶,SaveChanges()
,然後分別添加地址。
Customer c = new Customer { ... };
context.Customer.Add(c);
context.SaveChanges(); // In order to get the CustomerId to be filled in
Address a = new Address { AddressType = 1, ForeignKeyId = c.CustomerId };
context.Address.Add(a);
context.SaveChanges();
這會在代碼結構上導致一些問題。首先,事情的方式,我們可能不會在同一地點添加客戶和地址。其次,更重要的是,這需要兩個SaveChanges(),這意味着我們不再需要一個事務(或者我們必須完成自己的事務並執行它)。
我希望做的是更多這樣的:
Customer c = new Customer { ... };
context.Customer.Add(c);
Address a = new Address { AddressType = 1 };
context.Address.Add(a);
// Somehow magic happens and Address can be associated with
// Customer as soon as we have a CustomerId assigned.
context.SaveChanges();
我知道有什麼神奇的,但有沒有辦法爲我完成我想要一個的SaveChanges()?
編輯:如果相關,這是Database First EF。
數據庫沒有關係 - 它不能,因爲地址可以指向客戶,訂單,供應商,並且這些表根本沒有參考地址。這將是一對一的關係。我很欣賞迄今爲止的答案,我正在考慮它將如何工作。 –
所以看着你鏈接到的SO回答,這嚴格限制在兩張表之間?我這種情況地址有可選的客戶,也有可選的訂單,也有可選的供應商。 –
對於您的Edit2,我認爲您錯過了Address需要CustomerId才能寫入的點(ForeignKeyId),這意味着這仍然是兩步操作。在SaveChanges()發生之前,CustomerId不會被填充/分配。 –