Inheritance 所需的每种类型的实体框架表

Inheritance 所需的每种类型的实体框架表,inheritance,entity-framework-4,table-per-type,Inheritance,Entity Framework 4,Table Per Type,我需要用1个基类和3个子类(4个类) 基类:用户 子类:客户、办公室用户、员工 在我的数据库中,我只有3个表:用户、客户和员工 我没有OfficeUsers表,因为我需要的所有数据都已在Users表中。 在未来,我希望能够创建报告,列出客户、员工和办公用户的数量 我不想使用TPH,因为我在Clients和Employees表中有很多不可为空的字段。 我是否应该只使用UserId创建OfficeUsers表以便实现TPT 这对我来说不是很好的设计-只有PK表,所以我可以正确地映射它-请纠正我,如果


我需要用1个基类和3个子类(4个类)
基类:用户
子类:客户、办公室用户、员工

在我的数据库中,我只有3个表:用户、客户和员工
我没有OfficeUsers表,因为我需要的所有数据都已在Users表中。
在未来,我希望能够创建报告,列出客户、员工和办公用户的数量

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

另一个选择是在Users表中使用UserType colum并将其用作鉴别器,但它是否可以与TPT一起工作?是否有可能创建一个缺少表的TPT并使用鉴别器,看起来像是混合TPT和TPH,我认为这是不可能的

提前感谢您的回答

编辑:

也请考虑这个场景:
我正在引入一个名为

MobileUser
的新类,它也具有与
User
相同的字段。在这种情况下,如果不为用户类型引入新列,我无法知道系统中有多少
移动用户
和多少
办公用户

在这种情况下,有2个空表(仅PK)比在我的查询中创建表数依赖项更好/更糟,并且还阻止我使用一些LINQ查询(请参阅Ladislav Mrnka答案下的注释)

编辑2:


将来我可能不得不在
OfficeUser
中添加字段,所以我开始认为空表可以作为一种选择,至少C#code(查询)看起来更干净。如果你有更好的方法,请告诉我

如果您的
OfficeUser
User
完全相同,那么您不需要任何额外的类。使用
User
而不是
OfficeUser
以及
Employee
Client
的派生类。我认为这只是一个透视问题,而不是架构问题。。。因为无论你做什么,最终都会得到一张PK表

您可以创建一个OfficeUsers表,其中可以只包含用户的PK。。。只是不要让它成为继承的类型。现在,您有了使用office的所有用户的列表,您可以对其进行查询。结构完全相同,但思路有点不同

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

但是,由于您(我猜想)只有一个office,因此不需要外键,因此您只需要一个表来容纳使用office的用户。。。这是“一个6个,另一个半打”,无论你选择哪种方式,都完全一样


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

@ladislav mrnka我在考虑这个问题,但我将无法使用诸如
其中用户是OfficeUser
来自entities.Users.OfType()中ou的查询。为了找出办公用户的数量,我必须获得所有用户,其中用户不是客户或雇员是的,这是真的。您必须使用
Where(x=>!(x是雇员))
@ladislav mrnka-Yup,当我引入新表,如
MobileUser
时,我必须修改查询以确保它包含另一个表(在本例中,Where子句中的3个“is not”语句)。您认为这个解决方案比为OfficeUser创建空表好吗?不,这不是更好的解决方案,但添加空表看起来也不像解决方案。我会考虑的。