4

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

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

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

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

目前我不知道如何只用两个 POCO 来实现这一点。

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

4

3 回答 3

5

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

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

于 2011-03-16T14:45:05.470 回答
1

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

于 2011-03-16T14:44:34.457 回答
0

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

希望有帮助

于 2011-03-17T18:26:05.073 回答