c# - Linq to SQL,多对多设计

标签 c# sql linq-to-sql

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

现在,我已经使用枚举并从中创建了一个同名的 SQL 表,并向其中添加了 4 个角色。现在我正在尝试设计对象表,但我不知道如何让多对多关系为它工作。我还希望它能与 Linq-to-SQL 配合使用。保留枚举会很好,但如果不保留,字符串数组也可以。

简而言之,我需要一个在 Roles 和 Object.Roles(或 Object.Roles[])之间具有多对多关系的表

谢谢!

最佳答案

通常,Linq2SQL(和 Entity Framework)中的多对多关系是通过引入关联表创建的,其中只有您要链接的两个表中的主键,每个表的位置行对应一个关联。

由于您的 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属性(property)。

更新:作为对评论的回应,如果我想包含一个场景,每个老师可以给一些学生布置家庭作业,那么我将如何构建数据库的其余部分问题:

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)

如您所见,这里有相当多的表格。但是,这种结构允许您让每个教师创建许多家庭作业,然后将每个作业分发给一些学生。您将拥有导航属性 Student.HomeworkAssignments类型 IEnumerable<HomeworkAssignment> ,您可以通过它找到学生必须回答的所有问题。对于每个发布的答案,您在 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)

请注意,此代码未经测试,可能无法像我说的那样工作。我只是竭尽全力在这里 =)

关于c# - Linq to SQL,多对多设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5148815/

相关文章:

c# - foreach 与 : please explain the assembly code difference

mysql - SQL 结果的随机样本

c# - 这两个linq查询之间有什么区别?

c# - 通过 LINQ 检查分隔字段中的值

c# - 使用 Linq-2-Sql : Editing private fields doens't trigger update, 编辑公共(public)属性进行更新。为什么?

c# - 用作异步任务时出现后台服务错误

c# - 从列表中获取相同元素的总和

c# - 如何在数组中找到重复项并显示它们出现的次数?

sql 查找列停止递增的行

将 .DBF 文件转换为 .MYSQL 的 PHP 脚本