最初の検査では、Entity Framework 5 のバグのように見えます。
T4 で生成された DbContext および Entity クラスがあります。監視可能なコレクションをサポートするために、デフォルトの T4 テンプレートを少し変更したことに注意してください。
遅延読み込みが有効になっており、これを行っている場合を除いて、アプリケーション全体で正常に機能しています。
courseEnrolment.Student.CourseEnrolments.ToList()
つまり、既にメモリにロードした courseEnrolment に対して、その親 ( Student
) にアクセスし、それに関連付けられているすべてのものをロードしCourseEnrolments
ています。これには、元の courseEnrolment も含まれます。これが発生すると、秒CourseEnrolment
は conext (およびLocal
コレクション) に正常に遅延ロードされますが、そのナビゲーション プロパティはすべてnull
、対応するDynamicProxy
.
これは、新しくロードされたCourseEnrolment
外観です。通常のプロパティがデータベースから正常にロードされているにもかかわらず、すべてのナビゲーション プロパティが null であることに注意してください。
そして、これは通常のCourseEnrolment
外観です。
遅延読み込みに成功したエンティティが、遅延読み込みによって独自のナビゲーション プロパティを満たすことができない理由を知っている人はいますか?
問題の原因に関する詳細情報を更新してください
次の最小限のコードで問題を再現できました。Local
この問題は、私がコレクションを観察していることに関連しているようです。
var context = new PlannerEntities();
Debug.Assert(context.CourseEnrolments.Local.Count() == 0);
context.CourseEnrolments.Local.CollectionChanged += (sender, e) =>
{
Debug.Assert(e.NewItems.OfType<CourseEnrolment>().All(x => x.Adviser != null), "newly added entity has null navigatigon properties");
};
var c1 = context.CourseEnrolments.Single(x => x.EnrolmentId == "GA13108937");
Debug.Assert(context.CourseEnrolments.Local.Count() == 1);
Debug.Assert(context.CourseEnrolments.Local.All(x => x.Adviser != null));
c1.Student.CourseEnrolments.ToList();
Debug.Assert(context.CourseEnrolments.Local.Count() == 2);
Debug.Assert(context.CourseEnrolments.Local.All(x => x.Adviser != null),"some navigation properties were not lazy loaded");
ハンドラー内のアサーションはCollectionChanged
失敗します。これは、この時点でナビゲーション プロパティが満たされていないことを示しています。最終的なアサーションは失敗しません。これは、後でObservableCollection
イベントが処理された後、エンティティが満たされていることを示します。
コレクションのCollectionChanged
イベントでナビゲーション プロパティにアクセスする方法はありますか?Local