Code First POCO设计

时间:2012-02-17 17:55:43

标签: c# entity-framework-4 ef-code-first code-first

我首先使用实体​​框架代码创建数据库,但我遇到了数据库/ POCO设计的一些问题。我的问题在于继承。

我的系统有两个主要用户角色Lecturer和Student。我有一个基本用户类,其中包含Id,Logon,Role(将其标识为讲师或学生),Forename和Surname。如果用户是讲师,那么他们也有与之关联的标签属性(关系)。如果用户是学生,那么他们就有年级和学位类型的属性。

两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从Project.Proposer获得Lecturer或Student类型,但我似乎无法做到这一点。我也不确定Project.Proposer是否应该是项目类中的User(基类)类型,我是否可以使用接口(首先是代码)或者是什么。

我很感激人们可以给我的任何指导或想法,我尝试了许多变化但似乎没有给我想要的结果。注意:我试图避免使用具有冗余数据的用户类,因此我不希望用户类包含讲师和学生的字段。

2 个答案:

答案 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类以检查用户角色是什么,然后从讲座或学生表中获取必要的详细信息