通常,Linq2SQL(和实体框架)中的多对多关系是通过引入关联表创建的,只有您要链接的两个表中的主键以及每个行对应于协会。
由于您的Role
和Object.Role
可能难以分开以试图解释这一点,我再举一个例子:在一所学校里,每个老师可以有很多学生,每个学生可以有很多老师。该表结构来表示那么这将是
Teachers Students StudentTeacherRelations
******** ******** ***********************
TeacherId StudentId TeacherId
FirstName FirstName StudentId
etc... etc...
现在,LINQ2SQL和EF都足够聪明,认识到这是一个许多一对多的关系,并在模型中引入的导航性能。与Student对象相应属性的POCO看起来是这样的:
public class Student
{
public int StudentId { get; set; }
public string FirstName { get; set; }
// etc
public IEnumerable<Teacher> Teachers { get; }
}
如果设置正确时,O/R映射器将自动填充Teachers
财产。
更新:在回应评论,这里是我怎么会结构数据库的其余部分,如果我想有这样一个场景,每一个老师可以给一些学生的家庭作业由许多的问题:
HomeworkAssignments Questions Answers
******************* ********* *******
HomeworkAssignmentId (pk) QuestionId (pk) AnswerId (pk)
... HomeworkAssignmentId (fk) QuestionId (fk)
... StudentId (fk)
...
StudentHomeworkAssignmentRelations TeacherHomeworkAssignmentRelations
********************************** **********************************
StudentId (fk) Teacherid (fk)
HomeworkAssignmentId (fk) HomeworkAssignmentId (fk)
正如你所看到的,这里有相当多的表格。但是,这种结构允许您让每位教师创作许多家庭作业,然后将每个作业分发给多位学生。您将拥有类型IEnumerable<HomeworkAssignment>
的导航属性Student.HomeworkAssignments
,通过它您可以找到学生必须回答的所有问题。对于每个发布的答案,您在Answers
表中存储了一行,该表通过一对多关系链接到问题和学生,每个答案只能属于一个问题,并且只能由一个学生给出。
这里的关键是你不需要能够直接访问学生给出的每个答案 - 在Linq2SQL和EF中,都可以以各种方式同时从多个表中请求数据。其中的一个方法就是
var answersToTheLastExam = context.Students
.SelectMany(s => s.HomeworkAssignments)
.OrderBy(ha => ha.Date) // this might need modifying to get the last one first
.First(ha => ha.Questions.Count() > 0)
.SelectMany(ha => ha.Questions)
.SelectMany(q => q.Answers)
.Where(a => a.StudentId == myId)
请注意,此代码是未经测试,我说,这将在可能无法正常工作。我只是想尽我所能在这里头顶=)
谢谢!我有一个后续问题。比方说,我更进一步说,在你们的例子中,每个老师给出25个'HomeWorks',每个老师有50个'Questions',现在每个学生不仅与老师有一对一的对话,而且现在每个' HomeWorks'。并且可以说我们想要记录每个学生在每个“HomeWorks”上得到的正确答案(每个问题不仅仅是34/36)。对于这个例子,可以说'HomeWorks'与一个Teacher有一个关联,并且有一个与'Questions'的一对多关联。学习所有'HomeWorks',教师和'问题'的最佳方法是什么? – 2011-03-01 00:02:49
更多关于上面的评论。可以说一个学生有3位教师。那就意味着一个学生只有他一共有3750个“问题”记录。这似乎很多,有没有更好的方式来处理这种情况? – 2011-03-01 00:07:07
在索引良好的数据库中,单个表中的记录数可以达到数千万,而不会成为问题,因此3750真的没有什么可担心的。 (但是,如果您开始接近数百万条记录,请考虑在低强度期间定期重建索引......)有关一般的作业结构,请参阅我的编辑(我现在将开始编写...) – 2011-03-01 10:53:48