C# 代码优先的POCO设计
我正在首先使用实体框架代码创建一个数据库,但我在数据库/POCO设计方面遇到了一些问题。我的问题是继承 我的系统有两个主要用户角色讲师和学生。我有一个基本用户类,它包含Id、登录、角色(将他们标识为讲师或学生)、名字和姓氏。如果用户是讲师,则他们还具有与之关联的标记属性(关系)。如果用户是学生,则他们有年份和学位类型属性 这两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从项目中得到讲师或学生类型。提议者,但我似乎无法做到这一点。我也不确定Project.Proposer是否应该是Project类中的User类型(基类),我是否可以使用接口(首先使用代码)或者什么C# 代码优先的POCO设计,c#,entity-framework-4,ef-code-first,code-first,C#,Entity Framework 4,Ef Code First,Code First,我正在首先使用实体框架代码创建一个数据库,但我在数据库/POCO设计方面遇到了一些问题。我的问题是继承 我的系统有两个主要用户角色讲师和学生。我有一个基本用户类,它包含Id、登录、角色(将他们标识为讲师或学生)、名字和姓氏。如果用户是讲师,则他们还具有与之关联的标记属性(关系)。如果用户是学生,则他们有年份和学位类型属性 这两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从项目中得到讲师或学生类型。提议者,但我似乎无法做到这一点。我也不确定Project.Proposer是否应
我会很感激人们能给我的任何指导或想法,我尝试了很多变化,但似乎没有一个能给我想要的结果。注意:我试图避免使用具有冗余数据的用户类,因此我不希望用户类包含讲师和学生的字段。如果您不希望使用用户类作为提议者,那么使用类似于ProposedUserId的属性(ProposedUserId)如何,您可以查询用户类,检查用户角色是什么,然后从讲座或学生表中获取必要的详细信息。在EF4代码中正确执行此操作的方法首先是在项目上有一个
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; }
}
公共类标记
{
[关键]
公共int ID{get;set;}
}
公共抽象类用户
{
[关键]
公共int ID{get;set;}
公共字符串名{get;set;}
公共字符串Surename{get;set;}
}
公共课讲师:用户
{
公共IEnumerable名称{get;set;}
}
公共班级学生:用户
{
公共IEnumerable名称{get;set;}
}
公共类项目
{
[关键]
公共int ID{get;set;}
公共用户提议者{get;set;}
}
还有其他的方法来构建这个结构,比如通过使用像讲师项目
学生项目
这样的类为项目引入层次结构,并将具有正确类型的提议者
移动到这些类中,但不推荐这样做。因为您必须始终单独处理这些项目类。例如,检索项目名称及其提议者时。由于基本项目类不再具有proposer属性,因此需要对同一查询执行两次。我希望我能说明使用这种方法时出现的问题
您需要问自己的下一个问题是,您是否关心数据如何保存在数据库中?由于有3种方法可用于继承类:
一句忠告。如果您不打算存储数百万条记录,那么不要介意它实际上是如何存储在数据库中的<代码>每个层次结构的表是迄今为止最容易使用的,尤其是在开始时,也是默认值。谢谢,这似乎很有效。必须有讲师项目和学生项目(同样是一个基类和不同的子类),因为他们有不同的领域。感谢关于不同继承的链接,这是一本有趣的书,很高兴知道这些东西是如何工作的。除了is机制之外,我还经常使用类型为的实体框架。再次感谢你的帮助