2011-05-29 114 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位列 - 它不是很好,它的可扩展性较差,但使用起来非常简单。这两个比特列在关系表示的情况下也是有用的。