【问题标题】:A question about entities, roles and interfaces in Entity Framework 4关于Entity Framework 4中的实体、角色和接口的问题
【发布时间】:2010-05-14 09:46:34
【问题描述】:

我是一位经验丰富的 .NET 开发人员,但对 EF 不熟悉 - 所以请多多包涵。我将用一个大学申请的例子来说明我的问题。我有这些用户角色:

讲师、学生、管理员。

在我的代码中,我设想将这些实体作为不同的类来使用,例如讲师教授一组学生。并与 'is Student' 'TypeOf' 等一起工作。

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

在 EF 设计器中,我可以创建一个基本实体 Person(或 User...),并让 Lecturer、Student 和 Administrator 都继承自该实体。

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

如果我要添加其他实体,例如 Employee 和 Warden,那么问题就更大了。

我大概可以使用接口,因此人们可以实现 ILecturer 和 IStudent,但是我看不出这如何适合 EF。

如果可能的话,我想在 EF 设计器中工作,并且我的工作是模型优先(使用 C# 编码)。

因此,我们非常欢迎并非常感谢任何帮助和建议/示例。

谢谢

【问题讨论】:

    标签: entity-framework inheritance interface roles entity-framework-4


    【解决方案1】:

    不要让StudentLecturer 继承自Person。正如你所说,如果“鲍勃”既是学生又是讲师呢?这种情况在真正的大学中一直发生。您自己说得最好:这些是角色,而不是类型。一个人可以有很多角色。

    根据经验,在 O/R 映射中避免继承并非绝对必要(几乎从不)。就像编码时一样,优先考虑组合而不是继承。

    所以你可以给每个Person一个属性Roles,这是Roles的0..*集合。然后要获取学生列表,您可以执行以下操作:

    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
                   };
    

    【讨论】:

    • 嗨,克雷格,非常有帮助,谢谢!我正在考虑基于个人角色(多对多)和相关个人资料的模型,因此担任学生角色的人也有一个相关的学生个人资料。似乎工作得很好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多