每个类型的实体框架建议需要

时间:2011-05-25 10:34:46

标签: inheritance entity-framework-4 table-per-type


我需要实现具有1个基类和3个子类( 4个类)的解决方案 基类: 用户
子类: 客户端 OfficeUser 员工

在我的数据库中,我只有3个表用户客户员工
我没有 OfficeUsers 表,因为我需要的所有数据都已存在于 Users 表中。
在将来,我希望能够创建报告lisitng客户端,员工和OfficeUser。

我不想使用TPH,因为我在Clients和Employees表中有很多不可为空的字段。
我应该只使用UserId创建 OfficeUsers 表,以便实现TPT吗?
它看起来不是很好的设计 - 只有PK表,所以我可以正确映射 - 请纠正我,如果这样做的话。

另一种选择是在 Users 表中使用 UserType 列并将其用作鉴别器,但它是否适用于TPT?是否有可能创建具有1个缺失表的TPT并使用鉴别器,看起来像混合TPT和TPH,我认为这是不可能的。

提前感谢您的回答。

修改

请同时考虑这种情况:
我正在引入一个名为MobileUser的新类,它与User具有相同的字段。在这种情况下,我无法知道系统有多少MobileUsers和多少OfficeUsers而没有为用户类型引入新列。
在这种情况下有2个空表(只有PK)比在我的查询中创建依赖关于表的数量更好/更差,并且另外阻止我使用一些LINQ查询(请参阅我在Ladislav Mrnka回答下的评论)

编辑2:

将来有可能我必须向OfficeUser添加字段,所以我开始认为空表可以选择,至少C#代码(查询)看起来更干净。如果你有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:0)

如果您的OfficeUserUser完全相同,那么您不需要任何其他课程。使用User代替OfficeUser以及EmployeeClient的派生类

答案 1 :(得分:0)

我认为这只是一个透视问题,而不是一个建筑问题...因为无论你做什么,你最终都会得到一个PK表。

您可以制作 OfficeUsers 表,其中只包含用户的PK ...只是不要将其作为继承类型。现在您有一个使用办公室的所有用户的列表,您可以查询。结构完全相同,但思路有点不同。

如果您有多个办公室,那么您将拥有一个带有ID的办公室表,那么您的 OfficeUser 将拥有自己的类型表,因为额外的字段将是办公室外键。给你你想要的区别。

但是,因为你只(我认为)有一个办公室,你不需要一个外键,所以你只需要一个桌子来容纳使用办公室的用户...它是“6个,一半,半个十几个其他的“,无论你选择哪种方式,都完全相同。

这就是为什么我会在你的第二次编辑中使用你的直觉,你可能会在以后添加更多字段,所以你也可以制作一个“空”类型...因为无论哪种方式,你最终会得到一个只存储PK的表。