gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:40 24 4
gpt4 key购买 nike

我正在尝试获取一个对象并设计一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com