2010-11-23 24 views
6

私はEF4を使用していて、アイテムの更新と削除の問題が多かったです。 私は挿入に満足していますが、更新と削除ではわかりません。多対多のEntity Frameworkを削除/更新します。

私は3つのテーブルと

  1. 教室の表

    ClassID-ClassName 
    
  2. 学生の表

    StudentID-StudentName 
    
  3. StudentClass表

    に一致する3 DTOクラスがあるとし0
    StudentID-ClassID 
    
    
    ///Happy all works I am using existing students to populate the class. Fine. 
    private void InsertClassRoom(ClassRoomDto classRoomDto) 
    { 
        using (var ctx = new TrainingContext()) 
        { 
         //Convert dto to Entity 
         var classRoomEntity = new ClassRoom { ClassID = classRoomDto.ClassId, ClassName = classRoomDto.ClassName }; 
         foreach (var studentInClass in classRoomDto.Students) 
         { 
          Student student = ctx.Students.Where(x => x.StudentID == studentInClass.StudentId).SingleOrDefault(); 
          classRoomEntity.Students.Add(student); 
         } 
         ctx.AddToClassRooms(classRoomEntity); 
         ctx.SaveChanges(); 
        } 
    } 
    

しかし、私は何をすべきか分からない2つのシナリオがあります。

  1. 更新教室名
  2. 追加1人の学生
  3. Update 1人の学生

上の名前は、クラスから生徒を削除します。
どうすればよいですか?

これはアップデートで私の試みです:すべての

private void UpdateClassRoom(ClassRoomDto classRoomDto) 
{ 
    using (var ctx = new TrainingContext()) 
    { 
     var classRoomEntity = new ClassRoom { ClassID = classRoomDto.ClassId, ClassName = classRoomDto.ClassName }; 
     foreach (var studentDto in classRoomDto.Students) 
     { 
      if (studentDto.StudentId == 0) 
      { 
       //it's a new student add it to the classroom 
       Student student = new Student { StudentID = studentDto.StudentId, StudentName = studentDto.StudentName }; 
       classRoomEntity.Students.Add(student); 
      } 
      else 
      { 
       //Alter name of the student 
       Student student = ctx.Students.Where(x => x.StudentID == studentDto.StudentId).SingleOrDefault(); 
       //update name 
       student.StudentName = studentDto.StudentName; 
       //? what do I do finish this attach or ??? 
      } 
     } 
     ctx.AddToClassRooms(classRoomEntity); 
     ctx.SaveChanges(); 
    } 
} 

public void DeleteStudent(ClassRoomDto classRoomDto) 
{ 
    using (var ctx = new TrainingContext()) 
    { 
     //lost on how to delete a student in many to many 
    } 
} 

答えて

11

まず、私はあなたが教室が既にデータベースに存在することを知っていることを前提としています。最も簡単な方法は、まずそれを照会することです。実際に新しいClassRoomエントリが挿入される理由は、ctx.AddToClassRooms(classRoomEntry)を使用しているためです。エンティティをコンテキストに関連付けて、EntityStateAddedに設定します。それは、DBからの学生を削除しますので、THRクラスから生徒を削除するために

private void UpdateClassRoom(ClassRoomDto classRoomDto) 
{ 
    using (var ctx = new TrainingContext()) 
    { 
     ClassRoom classRoomEntity = ctx. 
            ClassRooms. 
            Include("Students"). 
            Single(c => c.ClassID == classRoomDto.ClassId); 
     classRoomEntity.ClassName = classRoomDto.ClassName; 

     foreach (var studentDto in classRoomDto.Students) 
     { 
      if (studentDto.StudentId == 0) 
      { 
       // it's a new student add it to the classroom 
       Student student = new Student 
             { 
              StudentID = studentDto.StudentId, 
              StudentName = studentDto.StudentName 
             }; 
       classRoomEntity.Students.Add(student); 
      } 
      else 
      { 
       // Student exists in the DB, but you don't know whether it's 
       // already part of the student collection for the classroom 
       Student student = classRoomEntity. 
            Students. 
            FirstOrDefault(s => s.StudentID == studentDto.StudentId); 

       if (student == null) 
       { 
        // this student is not in the class, fetch it from the DB 
        // and add to the classroom 
        student = ctx. 
           Students. 
           SingleOrDefault(s => s.StudentID == studentDto.StudentId) 

        classRoomEntity.Students.Add(student); 
       } 

       // Update name 
       student.StudentName = studentDto.StudentName; 
       // Since student is now part of the classroom student collection 
       // and classroom IS attached => student is also attached 
      } 
     } 

     ctx.SaveChanges(); 
    } 
} 

は、あなたは、単にコレクションから削除する必要があります(ただし、コールctx.DeleteObject()しないでください。あなたのケースでは、上記のコードでは、新しい学生だけが追加されるため、このコードは処理されません。データベースにあるすべての生徒を照合するのではなく、DTOで照合するのではなく、簡単なアプローチをとることができます。学生:

private void UpdateClassRoom(ClassRoomDto classRoomDto) 
{ 
    using (var ctx = new TrainingContext()) 
    { 
     ClassRoom classRoomEntity = ctx. 
            ClassRooms. 
            Include("Students"). 
            Single(c => c.ClassID == classRoomDto.ClassId); 
     classRoomEntity.ClassName = classRoomDto.ClassName; 
     classRoomEntity.Students.Clear(); 

     foreach (var studentDto in classRoomDto.Students) 
     { 
      Student student; 
      if (studentDto.StudentId == 0) 
      { 
       // it's a new student add it to the classroom 
       student = new Student 
           { 
            StudentID = studentDto.StudentId, 
            StudentName = studentDto.StudentName 
           }; 
      } 
      else 
      { 
       student = ctx. 
          Students. 
          SingleOrDefault(s => s.StudentID == studentDto.StudentId) 

       // Update name 
       student.StudentName = studentDto.StudentName; 
      } 

      classRoomEntity.Students.Add(student); 
     } 

     ctx.SaveChanges(); 
    } 
} 

これはおそらくあなたが探しているアプローチです。最初のコードスニペットを書いて、新しいエンティティや既存のエンティティを処理する方法のさまざまなケースを示しましたが、より正確な2つ目の(より簡単な)アプローチです。お役に立てれば。

+0

FANTASTIC.THANKSあなたの助けを借りて!! EFを学ぼうとしていて、私は本当のプロジェクトをやっています。あなたの助けは驚異的です。 – user9969

+0

がんばろう! – Yakimych

+0

SUPEEEEEEEEEEER –

関連する問題