我正在使用EF 4.1 RC和CodeFirst / POCO按代码构建我的数据库。
想象一下,像师生一样有多对多的关系(一个教师可以有很多学生,一个学生可能有很多老师)。因此,我有两个POCO:(1)教师和(2)学生。
当EF创建相应的表格时,您最终会得到三个表格:(1)教师,(2)学生和(3)额外的联接表格。连接表恰好包含两个字段:Teacher_ID和Student_ID。
我想知道我是否有机会在连接表中添加额外的字段,例如“年级”(某位老师给某位老师的成绩)?
目前我不知道如何只用两个POCO来实现这一点。
所以我想我能做的就是手动创建第三个POCO(用于连接表),对吗?这肯定会奏效,但后来我失去了很好的导航属性,比如oneTeacher.Students.First()等。这就是为什么我还在寻找另一种方式的主要原因。
答案 0 :(得分:5)
这是正确的,并且不仅适用于Code-first。如果您的加入表中有额外的字段,您将把它映射为实体。反之亦然,如果您想在加入表中添加额外字段,则需要创建一个新实体,并为Teacher
和{{0}}提供零或一对多或一对多导航属性{1}}实体。无论如何,您无法访问Student
和Teacher.Students
并且必须通过中间实体。
或者,您可以考虑以不同方式对数据库结构进行建模,并将额外信息提取到Student.Teachers
或Teacher
或第四个实体中。但这完全取决于你的情况。
答案 1 :(得分:1)
是的,连接表不能有有效负载,或者您需要将其分解为2个一对多关联,这将导致创建第三个实体来保存PK以及其他属性。
答案 2 :(得分:0)
这是一个我仍然没有时间尝试的想法。也许您可以按原样保留您的学生和教师课程,并添加第三个POCO StudentGrade
,其中包含Student
,Teacher
和Grade
。然后,您必须使用流畅的API来确保Student
和Teacher
以及StudentGrade
类之间的多对多关系映射到同一个表。
希望有所帮助