【问题标题】:EF4.1 CodeFirst: Add field to join tableEF4.1 CodeFirst:添加字段到连接表
【发布时间】:2011-03-16 14:30:59
【问题描述】:

我正在使用 EF 4.1 RC 和 CodeFirst/POCO 通过代码构建我的数据库。

想象一下像老师-学生这样的多对多关系(一位老师可以有很多学生,一位学生可以有很多老师)。因此,我有两个 POCO:(1)教师和(2)学生。

当 EF 创建相应的表时,您最终会得到三个表:(1)Teachers、(2) Students 和 (3) 一个额外的连接表。连接表正好包含两个字段:Teacher_ID 和 Student_ID。

我想知道我是否有机会在连接表中添加一个额外的字段,例如“成绩”(某位老师给某位老师的分数)?

目前我不知道如何仅使用两个 POCO 来实现这一目标。

所以我想我所能做的就是手动创建第三个 POCO(用于连接表),对吗?这肯定会奏效,但是我失去了很好的导航属性,比如 oneTeacher.Students.First() 等。这就是我仍在寻找另一种方式的主要原因。

【问题讨论】:

    标签: ef-code-first entity-framework-4.1


    【解决方案1】:

    这是正确的,并且不仅适用于代码优先。如果您的连接表中有额外的字段,您将把它映射为一个实体。反之亦然,如果您想在联接表中添加一个额外字段,则需要创建一个新实体,并具有与 Teacher 和 Student 零或一对多或一对多的导航属性实体。在任何情况下,您都会失去访问Teacher.Students 和Student.Teachers 的便利性,并且必须通过中间实体。

    或者,您可以考虑对数据库结构进行不同的建模,并将额外信息提取到Teacher 或Student 或第四个实体中。但这完全取决于您的情况。

    【讨论】:

    • 好的,谢谢大家!这就是我所想的。只是想确定我没有错过某种隐藏功能;-)
    【解决方案2】:

    是的,连接表不能有有效负载,或者您需要将其分解为 2 个一对多关联,这将导致创建第三个实体来保存 PK 以及其他属性。

    【讨论】:

      【解决方案3】:

      这是一个我还没有时间尝试的想法。也许您可以保持您的学生和教师课程不变,并添加第三个 POCO StudentGrade,其属性为 Student、Teacher 和 Grade。然后,您必须使用 fluent API 来确保 Student 和 Teacher 之间的多对多关系以及 StudentGrade 类映射到同一个表。

      希望有帮助

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2016-11-13
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        相关资源
        最近更新 更多