일반적으로 Linq2SQL (및 Entity Framework)의 다 대 다 관계는 연결하려는 두 테이블의 기본 키만 사용하여 연결 테이블을 도입하여 만들어지며 각 행은 협회.
Role
과 Object.Role
은 이것을 설명하기 위해 구분하기가 어려울 수 있으므로 다른 예를 들겠습니다. 학교에서 각 교사는 많은 학생을 가질 수 있으며 각 학생은 많은 교사를 가질 수 있습니다. 테이블 구조는 다음
Teachers Students StudentTeacherRelations
******** ******** ***********************
TeacherId StudentId TeacherId
FirstName FirstName StudentId
etc... etc...
지금, Linq2SQL와 EF 둘 다 대다 관계로 인식 할 정도로 똑똑 것 나타내며, 모델의 탐색 속성을 소개합니다. 학생 객체에 적합한 특성을 가진 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 개의 홈 웍스에 50 개의 '질문'을주고, 이제는 각 학생이 선생님과 m-to-m만이 아니라 각각의 ' HomeWorks'. 그리고 우리는 각 학생들이 각 'HomeWorks'(34/36만이 아니라 질문 당)에 대해 올바른 것을 기록하고 싶다고 말합니다. 이 예제의 경우,'HomeWorks'는 교사 한 명과 '질문'이있는 일대 다 사람과 연관되어 있다고 가정 해 보겠습니다. '홈 웍스 (HomeWorks) ', 교사 (Teachers), 질문 (Question)을 통해 학생을 얻는 가장 좋은 방법은 무엇입니까? –
위의 의견에 대한 자세한 내용. 한 학생에게 3 명의 교사가 있다고 가정 해 보겠습니다. 즉, 한 학생이 그에게 총 3750 개의 '질문'기록을 보유하게됩니다. 이것은 많은 것 같아요,이 상황을 처리하는 더 좋은 방법이 있습니까? –
잘 인덱싱 된 데이터베이스에서 레코드 수는 문제없이 하나의 테이블에서 수천만에 도달 할 수 있으므로 걱정할 필요가 없습니다. (그러나, 수백만 건의 레코드에 접근하기 시작하면 저조도 기간 동안 정기적으로 인덱스를 재구성하는 것을 고려하십시오 ...) 일반적인 숙제 구조에 대해서는 제 편집을보십시오 (지금부터 쓰겠습니다 ...) –