2016-10-13 7 views
0

私はEntityBを複数持ち、EntityBは複数のEntityAを持つことができます。簡単にするために:EF多数関係の循環ロード

class Student 
{ 
    public string Name {get;set;} 
    public virtual ICollection<Teacher> Teachers{get;set;} 
} 

class Teacher 
{ 
    public string Name {get;set;} 
    public virtual ICollection<Student> Students{get;set;} 
} 

私はこのようなマッピングを行います。

HasMany(x => x.Teachers) 
.WithMany(x => x.Students) 
.Map(x => 
{ 
    x.MapLeftKey("StudentId"); 
    x.MapRightKey("TeacherId"); 
    x.ToTable("StudentTeacher"); 
}); 

遅延読み込みがで投入されます。

私は教師を含む学生(教師の名前だけを意味する)をロードしたいが、他の生徒はいないし、教員もいない。私はこのようなものを試しました:

var student = _context.Students.Where(x => x.Name == studentName) 
.Include(x=>x.Teachers) 
.SingleOrDefault(); 

しかし、私は本当にオブジェクトを取得します。私は最初のレベルをロードしたいだけです。

どうすればいいですか?

答えて

0

これは、オブジェクトグラフ全体を読み込んでいるように見えるデバッグの場合でも、EFは子エンティティに最初のエンティティのみを設定していても正常です。

のは、あなたがこのデータを持っているとしましょう:

テーブル:

学生

1 | Student1 
2 | Student2 

教師

1 | Teacher1 
2 | Teacher2 

StudentTeacher

1 | 1 
1 | 2 
2 | 1 
2 | 2 

EFクエリ

var student = _context.Students.Where(x => x.Name == "Student1") 
.Include(x=>x.Teachers) 
.SingleOrDefault(); 

はあなたに与えます:

student.Teachers = ("Teacher1", "Teacher2") 

student.Teachers[1].Students = ("Student1") 
student.Teachers[2].Students = ("Student1") 

をあなたは最後の2行は、各教師がそれらに{"Student1", "Student2"}を添付しているにもかかわらず、バック"Student1"のみをもたらすかを見ることができます。

+0

です。これは私が期待していることですが、それは実際に私が得るものではありません。私の問題は、私も完全な "学生"オブジェクトを取得することです。私は本当に "学生"と "教師"を持っていない、私は単純な例としてこれを置くだけです。 – Novak

+0

あなたは正しいと思われます。私が経験していたのは、VSデバッガの機能です。 – Novak

+0

もう少しテストしましょう。 – Novak

0

Web APIを使用してシステムにアクセスすると、最初はシリアル化に問題がありました。私はJSONシリアライザが参照ループ処理を無視するように設定していますが、JSONシリアライザがこれを処理するので、重複していないオブジェクトのグラフを部分的に完全に扱います。私は怠惰な読み込みがオンであることを知った(私はそうではないと仮定していた:-))。私はそれをオフにしてデバッグを開始し、デバッガではオブジェクトの「完全なグラフ」が読み込まれていましたが、これはデバッガの機能であるとは考えていませんでした。

Web APIを使用してシステムに再度アクセスすると、動作が予想されます。長い話を短くするには、私の問題は遅延ロード

関連する問題