0

我是一位经验丰富的.NET开发人员,但对EF来说是新手 - 所以请耐心等待。我将用一个大学申请的例子来说明我的问题。我有这些用户角色:关于实体框架中的实体,角色和接口的问题4

讲师,学生,管理员。

在我的代码中,我设想将这些实体作为不同的类来处理,例如,一位讲师教授一批学生。并且与'学生''TypeOf'一起工作等。

这些实体中的每一个共享许多共同的属性/方法,例如他们都可以登录系统并做与他们角色相关的东西。

在EF设计师中,我可以创建一个基本实体Person(或User ...)并让讲师,学生和管理员都从中继承。

我遇到的困难是,讲师可以成为管理员 - 事实上有时学生可以成为讲师。

如果我要添加其他实体,例如Employee和Warden,那么这会导致更多的问题。

我大概可以与Interfaces一起工作,这样一个人就可以实现ILecturer和IStudent,但是我不明白这是如何适合EF的。

我想在EF设计师的工作,如果可能的话,我正在模型优先(用C#编码)。

因此,任何帮助和建议/样品将非常欢迎和非常感谢。

感谢

回答

0

不要StudentPersonLecturer继承。正如你所说,如果“鲍勃”既是学生又是讲师?在真实的大学里,一直是。你最好自己说:这些是角色,不是类型。一个人可以有很多角色。作为一个经验法则,当它不是绝对必要时(几乎从不),在O/R映射中避免继承。就像编码时一样,赞成继承的构成。

所以,你可以每个Person属性Roles这是一个0 .. *收藏Role秒。然后让学生的名单,你可以这样做:

var students = from p in Context.People 
       where p.Roles.Any(r => r.Id = studentRoleId) 
       select p; 

或者你可以有一个相关的Student型与PersonStudent之间的0..1关系;这将允许你为学生添加额外的数据,例如:

var students = from p in Context.People 
       where p.StudentInfo != null 
       select new 
       { 
        Id = p.Id, 
        Name = p.Name, 
        Grades = p.Student.Grades 
       }; 
+0

嗨克雷格,这是非常有益的感谢!我正在考虑一个基于人物角色(多对多)和相关配置文件的模型,因此担任学生角色的人也有相关的学生配置文件。似乎工作得很好。再次感谢。 – mvole 2010-05-15 08:26:29