2012-02-17 60 views
2

我创建一个数据库首先使用实体​​框架代码,我有一些问题与数据库/ POCO设计。我的问题是继承。代码第一POCO设计

我的系统有两个主要的用户角色讲师和学生。我有一个基本的用户类,其中包含身份证,登录,角色(确定他们是讲师还是学生),名字和姓氏。如果用户是讲师,那么他们也有与他们相关的标签属性(关系)。如果用户是学生,那么他们有一年和学位类型的财产。

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

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

回答

2

在EF4 CodeFirst中正确使用此方法的方法是在项目上拥有Proposer类型的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; } 
} 

还有其他的方法来构建这个,比如使用LecturerProjectStudentProject这样的类为项目引入层次结构,并将Proposer以正确的类型移动到这些类中,但不建议这样做。因为你将一直需要分别处理这些项目类。例如,当检索项目名称和它的提议者时。由于基础项目类不再有提议者属性,因此您需要两次具有相同的查询。我希望我能说明使用这种方法时出现的问题。


下一个问题你需要问自己的是,你关心数据如何保存在数据库?由于有3种方式与继承这样的类:建议

一个字。如果你不打算存储数百万条记录,不要介意它是如何存储在数据库中的。 Table per Hierarchy是迄今为止最容易使用的,特别是在开始时,它也是默认设置。

+0

谢谢,这似乎是工作。无论如何,必须有讲师项目和学生项目(又是基础班和不同的子班),因为他们有不同的领域。感谢有关不同继承的链接,一个有趣的阅读,这是很好的知道如何工作。除了is机制外,我也一直在使用实体框架OfType 。再次感谢你的帮助 – Manatherin 2012-02-26 13:26:20

0

如果你不想有一个用户类作为投保人,如何有一个属性像ProposedUserId,与ID,您可以查询User类检查用户的角色是什么,然后获取必要的细节来自讲座或学生表