gpt4 book ai didi

c# - Code First POCO 设计

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:53 25 4
gpt4 key购买 nike

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

我的系统有两个主要的用户角色讲师和学生。我有一个基本用户类,其中包含 ID、登录、角色(将他们标识为讲师或学生)、名字和姓氏。如果用户是讲师,那么他们也有一个与之关联的标签属性(关系)。如果用户是学生,那么他们有年份和学位类型的属性。

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

如果有人能给我任何指导或想法,我将不胜感激,我尝试了很多变体,但似乎没有一个能给我想要的结果。注意:我试图避免拥有一个包含冗余数据的用户类,因此我不希望用户类包含讲师和学生的字段。

最佳答案

在 EF4 CodeFirst 中正确执行此操作的方法是在项目上具有 User 类型的 Proposer 属性。

检索项目后,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 移动到类中的正确类型,但不推荐这样做。因为您将始终必须单独处理这些项目类。例如,在检索项目名称及其提议者时。由于基础项目类不再具有 proposer 属性,因此您需要两次进行相同的查询。我希望我能说明使用这种方法时出现的问题。


下一个你需要问自己的问题是,你关心数据是如何保存在数据库中的吗?因为对于具有继承的类有 3 种方法可以做到这一点:

一个忠告。如果您不打算存储数百万条记录,请不要介意它实际上是如何存储在数据库中的。 Table per Hierarchy 是迄今为止最容易使用的,尤其是在开始时,它也是默认设置。

关于c# - Code First POCO 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9333065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com