我首先使用实体框架代码创建数据库,但我遇到了数据库/ POCO设计的一些问题。我的问题在于继承。
我的系统有两个主要用户角色Lecturer和Student。我有一个基本用户类,其中包含Id,Logon,Role(将其标识为讲师或学生),Forename和Surname。如果用户是讲师,那么他们也有与之关联的标签属性(关系)。如果用户是学生,那么他们就有年级和学位类型的属性。
两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从Project.Proposer获得Lecturer或Student类型,但我似乎无法做到这一点。我也不确定Project.Proposer是否应该是项目类中的User(基类)类型,我是否可以使用接口(首先是代码)或者是什么。
我很感激人们可以给我的任何指导或想法,我尝试了许多变化但似乎没有给我想要的结果。注意:我试图避免使用具有冗余数据的用户类,因此我不希望用户类包含讲师和学生的字段。
答案 0 :(得分:2)
在EF4 CodeFirst中正确使用此方法的方法是在项目中具有类型为Proposer
的{{1}}属性。
检索项目后,Proposer将具有正确的类型,但该值将被设置为User
。为了弄清楚实际类型的实际情况,您可以使用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
是最容易使用的,尤其是在开始时,它也是默认值。
答案 1 :(得分:0)
如果您不希望将User类作为提议者,如何使用该ID获取 ProposedUserId 等属性,您可以查询User类以检查用户角色是什么,然后从讲座或学生表中获取必要的详细信息