2011-02-28 69 views
1

我试图拿一个对象并设计一个SQL表来存储它。该对象有一个名为“Roles”的成员,它是一个具有4个值的枚举。每个对象可以有几个不同的角色。Linq to SQL,多对多设计

现在,我已经使用枚举并创建了一个名为SQL的表,并将它添加到了4个角色中。现在我正试图设计对象表,并且我无法弄清楚如何获得为它工作的多对多关系。我也希望它能够与Linq-to-SQL一起使用。将枚举保存起来会很好,但如果不是一串字符串也可以。

总之,我需要有一个表中的许多一对多的角色和Object.Roles(或Object.Roles [])

谢谢之间!

回答

9

通常,Linq2SQL(和实体框架)中的多对多关系是通过引入关联表创建的,只有您要链接的两个表中的主键以及每个行对应于协会。

由于您的RoleObject.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) 

请注意,此代码是未经测试,我说,这将在可能无法正常工作。我只是想尽我所能在这里头顶=)

+0

谢谢!我有一个后续问题。比方说,我更进一步说,在你们的例子中,每个老师给出25个'HomeWorks',每个老师有50个'Questions',现在每个学生不仅与老师有一对一的对话,而且现在每个' HomeWorks'。并且可以说我们想要记录每个学生在每个“HomeWorks”上得到的正确答案(每个问题不仅仅是34/36)。对于这个例子,可以说'HomeWorks'与一个Teacher有一个关联,并且有一个与'Questions'的一对多关联。学习所有'HomeWorks',教师和'问题'的最佳方法是什么? – 2011-03-01 00:02:49

+0

更多关于上面的评论。可以说一个学生有3位教师。那就意味着一个学生只有他一共有3750个“问题”记录。这似乎很多,有没有更好的方式来处理这种情况? – 2011-03-01 00:07:07

+1

在索引良好的数据库中,单个表中的记录数可以达到数千万,而不会成为问题,因此3750真的没有什么可担心的。 (但是,如果您开始接近数百万条记录,请考虑在低强度期间定期重建索引......)有关一般的作业结构,请参阅我的编辑(我现在将开始编写...) – 2011-03-01 10:53:48