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

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

Mary-Kate Olsen
リリース: 2025-01-24 22:16:10
オリジナル
607 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート