2017-07-12 7 views
0

ルックアップテーブルを使用して多対多リレーションシップを作成しようとしています。私はStudentCourseあるマッピングテーブルを持っているルックアップテーブルエンティティフレームワークと多対多の関係

Student 
Id | Name 

:私は私のような学生を作成する別のテーブルの学生を持って

Course 
Id | Name 
1 | History 
2 | Maths 
3 | Science 

:私は表3の可能なコースを持っている「コース」を持っていると仮定します。ここで

StudentCourse 
ID | StudentId | CourseId 
1 | 1  | 3 

は私の学生&コースのクラスである:

私はビューからの学生のエンティティを作成すると、ユーザーはコーステーブルからコースを選択し、唯一の学生にエントリを作成する必要がありますエンティティフレームワークとEFに送信し、

modelBuilder.Entity<Student>() 
       .HasMany<Course>(s => s.Courses) 
       .WithMany(c => c.Students) 
       .Map(cs => 
         { 
          cs.MapLeftKey("StudentId"); 
          cs.MapRightKey("CourseId"); 
          cs.ToTable("StudentCourse"); 
         }); 

:最後に

は、ここで構成コードですStudentCourseテーブル。

私のシナリオでは、コーステーブルには選択したコースの新しいエントリが追加されています。だから私はコーステーブルに重複してしまいます。

エンティティフレームワークに、既にすべての可能なコースがあるので、コーステーブルにエントリを作成しないように指示するにはどうすればよいですか。

+0

重複を削除するために個別またはグループ化のいずれかを使用します。 – jdweng

+0

ビューにエンティティを渡すことを避け、関連するIDを持つViewModelsを使用します。サーバーに戻るときに、生徒エンティティを作成し、選択したIDに基づいて関連するコースを取得し、それらをコースを通じて新しい生徒エンティティに関連付けますコレクションを作成し、生徒をコンテキストDBSetとSaveChangesに追加します。別の方法として、「コース」エンティティを渡す場合は、学生を追加するDbContextに関連付けることを覚えておく必要があります。そうしないと、これらの重複が発生します。 IMOでは、エンティティをサービス/コントローラレベルのままにします。 –

+0

コードサンプルは役に立ちますか?私はエンティティフレームワークに新しいです。 @jdwengどのように私はDistinctコードですか? – DevHelp

答えて

0

問題はプレゼンテーションレイヤーにオブジェクトを配置していたため、作業単位の下にあるdbcontextは入れ子になっているオブジェクトについて認識しませんでした。そのため、既に存在する場合でも常にコースを再作成しようとします。この問題を解決するには、Courseオブジェクトを同じ作業単位dbcontextに移入します。

例:

student.Course = UnitOfWork.Repository.FindById(id); 
    var model = UnitOfWork.Repository.Add(student);