2016-09-01 18 views
0

暗黙的なジョイントテーブルを使用して多対多の共通パターンからシンプルにジョイントテーブルを使用して一種の遅延ロードを実装したい多対多の依存エンティティのエンティティへのリンクを持たないEFの多対多関係

これは、オブジェクトグラフがhttp経由でアプリケーションサーバーに渡される切断されたセットの設計によって枠が設定されています。サーバー上では、エンティティではなくキーだけを更新します。 その理由:エンティティモデルの異なるインスタンスで定義された同じエンティティを保存しようとすると、同時に発生するシナリオエラーが発生します。 代わりに、オブジェクトを渡すのではなく、ちょうどID付きのジョイントテーブルを渡すだけです。

Class 
------- 
int ID 
List ClassStudent 

Student 
------- 
int ID 
List ClassStudent 


ClassStudent // this type must be explicitely defined in the model 
-------------- 
StudentID 
ClassID 

FluentApiでこのような設定を定義することはできますか?

共通scenarionは、型を使用している:

Student 
--------------- 
int ID 
List Classes 

Class 
---------- 
int ID 
List Students 

私は同時変更のこのbeacuseは必要ありません。 流暢なAPIを手助けする必要があります。私は多くの場合を試みました。

答えて

2

はい、可能です。 ClassStudentと2つの一方向のone-to-manyリレーションシップ(Student -> ClassStudentClass -> ClassStudent)の複合PKを設定するだけです。このような

何か:

modelBuilder.Entity<ClassStudent>() 
    .HasKey(e => new { e.StudentID, e.ClassID }); 

modelBuilder.Entity<Student>() 
    .HasMany(e => e.ClassStudent) 
    .WithRequired() 
    .HasForeignKey(e => e.StudentID); 

modelBuilder.Entity<Class>() 
    .HasMany(e => e.ClassStudent) 
    .WithRequired() 
    .HasForeignKey(e => e.ClassID); 
+0

ありがとうございます!それは私を救った。私は外部キーでClassStudentを取得します。今、IQueryable を取得すると、を含むプロパティが空になります。 ClassStudentテーブルを個別にロードする必要がありますか?または、流暢なAPI設定を使用してプロパティを埋める別の方法がありますか? – Dmitry

+0

あなたは大歓迎です。私は最後のコメント/質問をよく理解していません。もっと特別なものは必要ありません。 'var classes = db.Class.Include(e => e.ClassStudent).ToList();'のようなものを実行すると 'ClassStudent'プロパティが読み込まれます。 'Student'sに似ています。 –

+0

はい、ちょうどデータを書き込むことを忘れてしまった。それは大丈夫です。 – Dmitry

関連する問題