Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码优先的POCO设计_C#_Entity Framework 4_Ef Code First_Code First - Fatal编程技术网

C# 代码优先的POCO设计

C# 代码优先的POCO设计,c#,entity-framework-4,ef-code-first,code-first,C#,Entity Framework 4,Ef Code First,Code First,我正在首先使用实体框架代码创建一个数据库,但我在数据库/POCO设计方面遇到了一些问题。我的问题是继承 我的系统有两个主要用户角色讲师和学生。我有一个基本用户类,它包含Id、登录、角色(将他们标识为讲师或学生)、名字和姓氏。如果用户是讲师,则他们还具有与之关联的标记属性(关系)。如果用户是学生,则他们有年份和学位类型属性 这两种类型的用户都可以创建项目。一个项目有一个提议者。我想要的是能够从项目中得到讲师或学生类型。提议者,但我似乎无法做到这一点。我也不确定Project.Proposer是否应

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

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

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


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

如果您不希望使用用户类作为提议者,那么使用类似于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机制之外,我还经常使用类型为的实体框架。再次感谢你的帮助