我是一名经验丰富的.NET开发人员,但对EF来说是新手 - 所以请耐心等待。我将使用大学应用程序的示例来说明我的问题。我有这些用户角色:
讲师,学生,管理员。
在我的代码中,我设想将这些实体作为不同的类来处理,例如讲师教授一系列学生。并使用'是学生''TypeOf'等。
这些实体中的每一个都共享许多共同的属性/方法,例如他们都可以登录系统并做与其角色相关的事情。
在EF设计器中,我可以创建一个基本实体Person(或User ...),并让Lecturer,Student和Administrator都继承自该实体。
我遇到的困难是讲师可以成为管理员 - 事实上,学生有时可以成为讲师。
如果我要添加其他实体,例如Employee和Warden,那么这就会引发更多问题。
我可能会使用Interfaces,所以一个人可以实现ILecturer和IStudent,但是我不知道这是如何适合EF的。
如果可能的话,我想在EF设计师中工作,我正在模型化(用C#编码)。
所以任何帮助和建议/样品都会非常受欢迎,非常感谢。
由于
答案 0 :(得分:0)
不要让Student
和Lecturer
继承自Person
。如你所说,如果“鲍勃”既是学生又是讲师呢?这种情况在实际大学里一直发生。你自己说得最好:这些是角色,而不是类型。一个人可以扮演很多角色。
根据经验,当不是绝对必要时(几乎从不),避免在O / R映射中继承。就像编码时一样,有利于组合而不是继承。
所以你可以给每个Person
一个属性Roles
,它是{... 1}}的0 .. *集合。然后,要获得学生列表,您可以这样做:
Role
或您可以拥有var students = from p in Context.People
where p.Roles.Any(r => r.Id = studentRoleId)
select p;
与Student
之间的0..1关系的相关Person
类型;这将允许您为学生添加其他数据,例如:
Student