質問: 私には、 `Field`と`Field2` 2つのクラスがあり、1 `Field2`関係にあります。 `Field`を取得しようとすると、IDと名前が正しいレコードがリストに返されます。しかし、読み取ろうと`Field2`から`Field`常に空です。 原因は何ですか?私はすべてを試しました。データベースなどでFKを見ることができます。 ``` public class Field : IEntityBase { public int Id { get; set; } public string Name { get; set; } [InverseProperty("Field")] public virtual ICollection Field2 { get; set; } } public class Field2: IEntityBase { public int Id { get; set; } public int FieldId { get; set; } [ForeignKey(nameof(FieldId))] public virtual Field Field { get; set; } } ```
回答: 理由は、EFコアのドキュメントの関連データの読み込みのセクションで説明されています。 最初の動作は、現在EF Coreが遅延読み込みをサポートしていないためです。通常、読み込み専用または読み込み専用の読み込みを行うまで、ナビゲーションプロパティには`null`返されます。ただし、 **Eager loading**セクションには次の内容が含まれています。 > **先端** > Entity Framework Coreは、以前にコンテキストインスタンスにロードされた他のエンティティにナビゲーションプロパティを自動的に修正します。したがって、ナビゲーションプロパティのデータを明示的にインクルードしなくても、関連エンティティの一部またはすべてが以前にロードされていた場合でも、プロパティにデータが格納されることがあります。 > > 2番目のケースでナビゲーションプロパティがnullではない理由が説明されています。 今、私は2つの行動のどちらを修正したいのか分からないので、両方に取り組もうとします。 最初の動作は、関連するデータをロードするために現在利用可能なメソッドの1つ、例えば熱心なロードを使用することによって "固定"することができます。 ``` var mutants = db.Mutants.Include(m => m.OriginalCode).ToList(); ``` 2番目の動作は「設計通り」であり、制御できません。それを避けたい場合は、必要なデータを再試行するために単一のクエリを実行するためだけに新しい`DbContext`インスタンスを使用してください。 **アップデート:** v2.1以降、EFコアはレイジーロードをサポートしています。ただし、デフォルトでは有効になっていないため、すべてのナビゲーションプロパティを`virtual` 、 Microsoft.EntityFrameworkCore.Proxiesをインストールし、 `UseLazyLoadingProxies`呼び出しで有効にするか、 プロキシなしでLazy-loadingを使用する必要があります。どちらもEFコアドキュメンテーション。