我首先使用实体框架代码创建数据库,但我在数据库/POCO 设计方面遇到了一些问题。我的问题是继承。
我的系统有两个主要用户角色讲师和学生。我有一个基本用户类,其中包含 ID、登录、角色(将他们标识为讲师或学生)、名字和姓氏。如果用户是讲师,那么他们还有一个与其关联的标签属性(关系)。如果用户是学生,那么他们有年份和学位类型属性。
两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从 Project.Proposer 获取讲师或学生类型,但我似乎无法做到这一点。我也不确定 Project.Proposer 是否应该是项目类中的 User 类型(基类),我是否可以使用接口(interface)(首先使用代码)或什么。
我很感激人们能给我的任何指导或想法,我尝试了很多变化,但似乎没有一个给我想要的结果。注意:我试图避免用户类包含冗余数据,因此我不希望用户类包含讲师和学生的字段。
最佳答案
在 EF4 CodeFirst 中正确执行此操作的方法是在项目上具有 User
类型的 Proposer
属性。
检索项目后,提案者将具有正确的类型,但该值将被装箱为User
。为了弄清楚实际类型是什么,您可以使用 is
关键字,如下所示:
// project is a Project instance
if (project.Proposer is Lecturer)
{
// do something
} else if (project.Proposer is Student)
{
// do something else
}
这是我建议的数据结构:
public class Tag
{
[Key]
public int ID { get; set; }
}
public abstract class User
{
[Key]
public int ID { get; set; }
public string Forename { get; set; }
public string Surename { get; set; }
}
public class Lecturer : User
{
public IEnumerable<Tag> Forename { get; set; }
}
public class Student : User
{
public IEnumerable<Tag> Forename { get; set; }
}
public class Project
{
[Key]
public int ID { get; set; }
public User Proposer { get; set; }
}
还有其他方法可以构建此结构,例如通过使用 LecturerProject
StudentProject
等类引入项目的层次结构,并将 Proposer
移动为将正确的类型放入这些类中,但不建议这样做。因为您始终必须单独处理这些项目类。例如,在检索项目名称及其提议者时。由于基础项目类不再具有提议者属性,因此您需要两次执行相同的查询。我希望我能够说明使用这种方法时出现的问题。
您需要问自己的下一个问题是,您关心数据如何保存在数据库中吗?对于具有继承的类,有 3 种方法可以实现此目的:
一句忠告。如果您不打算存储数百万条记录,请不要介意它实际上如何存储在数据库中。 Table per Hierarchy
是迄今为止最容易使用的,尤其是在开始时,也是默认的。
关于c# - 代码优先 POCO 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9333065/