c# - 代码优先 POCO 设计

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

我首先使用实体​​框架代码创建数据库,但我在数据库/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/

相关文章:

c# - 使用任务和 Task.WaitAny 进行异常处理

c# - 没有要从 MSTest 执行的测试

c# - 在任务管理器中更改我的程序名称

entity-framework-4 - 您可以在不使用向导的情况下使用 Entity Framework 4 调用 UDF 吗?

c# - 在 EF 4.x 中处理将 0/1 转换为 False/True 的最简单方法是什么?

c# - EF 代码首先排除列

c# - 如何使用预构建事件命令行将参数传递到 T4 模板

entity-framework - 分离 Entity Framework poco 和 objectcontext

sql-server - 在 MVC 中使用 Entity Framework Code First 更新现有数据库

ef-code-first - 添加迁移在代码迁移/代码优先中创建空迁移