ホームページ >バックエンド開発 >C++ >関連エンティティに直接アクセスするまで、EF Core ナビゲーション プロパティが null になるのはなぜですか?

関連エンティティに直接アクセスするまで、EF Core ナビゲーション プロパティが null になるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-24 22:16:10612ブラウズ

Why Are EF Core Navigation Properties Null Until Direct Access to Related Entities?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。