2015-09-22 40 views
1

我有了很多表,這將需要一個地址的項目引用:實體框架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。

回答

1

如果數據庫之間不存在關係,則必須添加()每個對象然後SaveChanges()。

這兩個例如一對一,一對多?

有一個關係,可以讓你寫你這樣的代碼:

Customer c = new Customer 
{ 
    ... 
    Address = new Address { AddressType = 1 } 
}; 

context.Customer.Add(c); 
context.SaveChanges(); 

如果你沒有一個數據庫關係成立,你不能做到這一點,你應該能夠虛擬化在EM的關係。

在上下文類文件,修改

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    //default statement 
    //throw new UnintentionalCodeFirstException(); 

    //establish the one-to-zero-or-one relation 
    modelBuilder.Entity<Customer>() 
     .HasOptional(c => c.Address); 
} 

添加適當的屬性與您的客戶和地址類。作爲一對一關係的例子。

在客戶public virtual Address Address {get; set;}public virtual Customer Customer {get; set;}在地址

我會更新的OnModelCreating()不久。我有一個會議要參加。如果任何人有任何額外的,只是把它扔在評論中(希望我不是太高))。

編輯 請參見此SO answer設置關係。

編輯2 IRT DB首先,只要表格在相同的上下文中,您只需要SaveChanges()一次。爲了確保上下文在DAO中相同,在DAO實例化時初始化上下文。

private DbEntities db = new DbEntities();

你會然後用這個db上下文實例貫穿始終。

+0

數據庫沒有關係 - 它不能,因爲地址可以指向客戶,訂單,供應商,並且這些表根本沒有參考地址。這將是一對一的關係。我很欣賞迄今爲止的答案,我正在考慮它將如何工作。 –

+0

所以看着你鏈接到的SO回答,這嚴格限制在兩張表之間?我這種情況地址有可選的客戶,也有可選的訂單,也有可選的供應商。 –

+0

對於您的Edit2,我認爲您錯過了Address需要CustomerId才能寫入的點(ForeignKeyId),這意味着這仍然是兩步操作。在SaveChanges()發生之前,CustomerId不會被填充/分配。 –