EF Core 遅延読み込みナビゲーション プロパティ
質問:
Entity Framework Core (EF Core) モデルでは、関連エンティティに直接アクセスする前に、ナビゲーション プロパティは最初に null を返します。
モデル:
<code class="language-csharp">public class Mutant { ... public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { ... public virtual ICollection<Mutant> Mutants { get; set; } }</code>
クエリの質問:
ミュータントを取得するとき、OriginalCode ナビゲーション プロパティは空です:
<code class="language-csharp">var mutants = db.Mutants.ToList(); mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为True</code>
関係の動的な充填:
ただし、関連する OriginalCode エンティティをクエリする場合:
<code class="language-csharp">var originalCodes = db.OriginalCodes.ToList();</code>
ミュータントの OriginalCode ナビゲーション プロパティが自動的に設定されます:
<code class="language-csharp">mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为False</code>
説明:
EF Core のプリロード メカニズムは、コンテキストに読み込まれた関連エンティティのナビゲーション プロパティを自動的に設定します。 2 番目のケースでは、OriginalCode が取得されると、対応するミュータントもコンテキストにロードされるため、それらのナビゲーション プロパティが設定されます。
解決策:
この動作を制御するには、プリロードなどの明示的なロード方法を使用する必要があります。
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
自動入力を防ぐには、新しい DbContext インスタンスまたは追跡なしのクエリを使用します。
更新:
EF Core v2.1 では、遅延読み込みがサポートされるようになりました。これを有効にするには、ナビゲーション プロパティを仮想としてマークし、Microsoft.EntityFrameworkCore.Proxies をインストールして、UseLazyLoadingProxies を呼び出します。
以上が関連エンティティに直接アクセスするまで、EF Core ナビゲーション プロパティが null になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。