2011-05-29 112 views
0

有一個客戶的新crm場景,他們有供應商和客戶,供應商也是客戶,反之亦然。每個層級的表只會讓一個人只能是一個或另一個,所以我認爲每種類型的表更適合。實體框架繼承

DB結構將是:

[Contact] 
ContactId pk 
Name 
... 

[Client] 
ContactId pk/fk 
VATNumber 
... 

[Supplier] 
ContactId pk/fk 
... 

任何人有從類似的情景其他任何建議或經驗?

回答

0

每種類型的表也將假設一個Contact是客戶端或供應商(如果您查看生成的SQL,則更清晰:例如,請參閱"Inheritance with EF Code First CTP5: Part 2 – Table per Type (TPT)")。

相反,我認爲你需要改變你的模型爲ContactContact-Role與一對多的關係。 Contact-Role將有SupplierClient亞型。整個Contact-Role層次可以被映射爲TPH或TPT。

這反映了一個面向對象的設計,其中每個客戶都有一個或多個角色(繼承「是一個」 releationship,永遠是獨特的,你不能有抽象類型client這同時是client兩種亞型的對象)。

+0

謝謝理查德,這很有趣,你能詳細說明一下嗎? – Chev 2011-05-29 09:04:41

+0

@Chev:我會試試。 – Richard 2011-05-29 10:22:46

0

這是行不通的,除非你將它建模爲三級繼承,這將要求客戶始終是供應商或供應商始終是客戶。我想這是不正確的模型在你的應用程序,這意味着你不能使用繼承。

您必須在contact-client和contact-supplier之間使用一對一(0..1-1)的關係,或者您可以簡單地將所有屬性放在單個表中,並添加IsClientIsSupplier位列 - 它不是很好,它的可擴展性較差,但使用起來非常簡單。這兩個比特列在關係表示的情況下也是有用的。