- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我首先使用实体框架代码创建数据库,但我在数据库/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/
目前,我正在为网络开发类(class)做作业。 这些是说明:第一行和首字下沉样式Jakob 希望文章的第一行以小写大写字母显示。转到 First Line and Drop Cap Styles 部分
.first() 方法是在 jQuery 1.4 中添加的。 :first 选择器自 1.0 以来就已存在。 来自文档: :first The :first pseudo-class is equiv
我正在审查现有的 ASP.NET MVC (5.2.3) EF (6.1.3) 项目。 该项目使用 ASP.NET Identity,我检查了 web.config 中的 2 个连接字符串,一个用于
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
for(auto it = M.begin(); it!=M.end();it++) { coutfirstsecondsecond == 1) return it->firs
我试图从第二个循环中获取循环的第一项。 我知道我得到了这样的@key @../key 但@first 似乎不像@../first 那样工作 有什么想法吗? 问候 最佳答案 首先,无论是否在嵌套 blo
var tab1 = $('.tabs a:first-child').attr('href'); alert(tab1); .. 尽管同一页面上有两个 div.switch,但仅匹配一个。第二个位于
我想知道如何将节点*变量 NODE 分配给结构内的数据? struct node { int info; struct node *link; }; typedef struct nod
我有两个段落包含在一个 div 中。我想让第一段的文字变大一点,但使用 :first-child 并不能像我所说的那样工作。看不出有什么问题。
我有一个 ul li 列表 Parent child1 child2
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
这有什么区别吗: myList.Where(item => item == 0).First(); 还有这个: myList.First(item => item == 0); 后者对我来说更有意义,
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
当我遇到一个奇怪的情况时,我正在研究 CSS 选择器。 如果我使用 :first-child 伪元素,我需要在它前面加上一个空格才能工作,否则它将无法工作。然而 :first-letter 伪元素的情
请考虑以下字符串数组: let strings = ["str1", "str2", "str10", "str20"] 假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 fil
让我们假设我们要开始新项目 - 包含一些业务逻辑的应用程序、ASP.NET 上的用户界面、WPF 或两者。我们想使用 ORM 或 DAL 代码生成器并在 .NET 类中实现我们的业务逻辑。我们可以通过
我有一种树系统。我想做的是给所有 parent 一个 margin ,除了第一个。这是我的 HTML: Test
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
我是一名优秀的程序员,十分优秀!