C#/.NET继承最佳实践

C#/.NET继承最佳实践,c#,.net,oop,C#,.net,Oop,我想知道从基类具有PK id的基类继承数据库模式的最佳实践是什么 假设我正在为一所学校开发一个应用程序。教师和工作人员各有其“职责”。我想要一个雇员基类。然后,我想要一个可以适用于任何类型员工的职务类别。也就是说,我不想创建一个TeacherDuty类和另一个StaffDuty类,其中TeacherId为FK,StaffId为FK,我想要一个Duty类,绑定到EmployeeId 这里的最佳实践是什么?或者,最好的做法是在教师值班和员工值班课程中,将FK分配给各自的班级。我正在尽量减少类的数量,

我想知道从基类具有PK id的基类继承数据库模式的最佳实践是什么

假设我正在为一所学校开发一个应用程序。教师和工作人员各有其“职责”。我想要一个雇员基类。然后,我想要一个可以适用于任何类型员工的职务类别。也就是说,我不想创建一个TeacherDuty类和另一个StaffDuty类,其中TeacherId为FK,StaffId为FK,我想要一个Duty类,绑定到EmployeeId

这里的最佳实践是什么?或者,最好的做法是在教师值班和员工值班课程中,将FK分配给各自的班级。我正在尽量减少类的数量,并使它们尽可能可重用(例如,如果有其他类型的员工,如管理员,我希望避免为AdministratorDuty创建另一个表)


你的层次结构仍然不太合理,因为你在那里有两次相同的教师课。我假设其中一个是
员工
,而不是
教师
。但即便如此,我也不太清楚为什么老师也不被视为员工

在继续之前,正确设计您的模式非常重要。我将尝试回答你们的实际问题,但这并不意味着这一定是正确的方法。我在最后提出了另一种模式设计,供您考虑。

回答你的问题 为了回答您的问题,我们可以看看ORM(即实体框架核心)是如何解决这类问题的。问题是,OOP和类的概念没有完全映射到关系数据库世界。即使您不打算使用实体框架,C#ORM类的实体框架也必须这样做,看看它们是如何解决这个问题的,可以为您提供见解

为了让事情变得更清楚,我将在每个类中添加一些假列。让我们假设这就是你的C#类的样子:

public class Employee
{
    public string Id { get; set; }
    public bool IsActive { get; set; } 
}

public class Administrator : Employee
{
    public string PhoneNumber { get; set; }
}

public class Teacher : Employee
{
    public string HomeRoom { get; set; }
}
因此,您可以看到管理员和教师都应该共享一个Id,以及他们是否处于活动状态。管理员存储他们的电话号码,教师需要一个家庭房间。管理员不需要家庭房间,教师也不需要电话号码。同样,这些列并不是真正的用例,只是一个例子

每个层次结构的表格

第一种方法(以及EntityFrameworkCore中的推荐/默认方法)是执行以下操作。这意味着您将有一个名为
Employee
的表,该表将包含表示每种类型员工(员工、教师、管理员等)所需的所有列。这意味着将有一个
EmployeeID
列来代表所有员工。神奇之处在于有一个“Discriminator”列来指定“ThisEmployeeisaX”

因此,您的
Employee
表如下所示:

纵队 类型 身份证件 NVARCHAR(50)PK 鉴别器 NVARCHAR(100)(非空) 活跃的 位(非空) 电话号码 NVARCHAR(50)(可为空) 指导教室 NVARCHAR(50)(可为空)
为什么需要
TeacherId
StaffId
Id
不够吗?如果没有充分的理由,FK可以是
Id
。首先。想一想如何使其正常化。教师是雇员。但在你的例子中,它也是员工。那是行不通的。此外,当教师继承员工时,也会输入其Id。因此,第二个教师Id是毫无意义的。在开始编写代码之前,先制作一个模型的图像。是的,对不起,我打错了。你的新编辑没有多大意义。没有
职员
,也没有
教师ID
职员
。您是否能够编辑问题,使代码与问题匹配,或者反之亦然。如前所述。现在还不要深入研究代码。首先,试着把你的模型想清楚。在纸上或任何东西上绘制图形,并定义所需的实体及其依赖项。在开始编码之前,试着把注意力集中在问题上。
public class Employee
{
    public string Id { get; set; }
    public bool IsActive { get; set; } 
}

public class Administrator : Employee
{
    public string PhoneNumber { get; set; }
}

public class Teacher : Employee
{
    public string HomeRoom { get; set; }
}