实体框架继承

时间:2011-05-29 07:52:39

标签: entity-framework

有一个客户新crm的场景,他们有供应商和客户,供应商也是客户,反之亦然。每个层次结构的表只允许一个人只有一个或另一个,所以我假设每种类型的表更适合。

db结构将是:

[Contact]
ContactId pk
Name
...

[Client]
ContactId pk / fk
VATNumber
...

[Supplier]
ContactId pk / fk
...

任何人都有类似情况下的任何其他建议或经验吗?

2 个答案:

答案 0 :(得分:0)

每种类型的表格还假设一个Contact是客户端或供应商(如果查看生成的SQL,则更清楚:例如,请参阅"Inheritance with EF Code First CTP5: Part 2 – Table per Type (TPT)")。

相反,我认为您需要将模型更改为具有一对多关系的ContactContact-RoleContact-Role会有SupplierClient个子类型。然后可以将整个Contact-Role层次结构映射为TPH或TPT。

这反映了一个OO设计,其中每个客户端都有一个或多个角色(继承,“is-a”的关联,永远是单一的,你不能有一个抽象类型client的对象同时是两个子类型client)。

答案 1 :(得分:0)

除非您将其建模为三级继承,否则这将无法工作,这将要求客户始终是供应商或供应商始终是客户。我想这不是你的应用程序中的正确模型,这意味着你不能使用继承。

您必须在contact-client和contact-supplier之间使用一对一(0..1-1)关系,或者只需将所有属性放在单个表中并添加IsClient和{{ 1}}位列 - 它不是很好,它不太可扩展,但它很容易使用。在关系表示的情况下,这两个位列也是有用的。