ホームページ >バックエンド開発 >C++ >明示的にロードされるまでEFコアナビゲーションプロパティがnullされるのはなぜですか?

明示的にロードされるまでEFコアナビゲーションプロパティがnullされるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-24 22:25:09725ブラウズ

Why are EF Core navigation properties null until explicitly loaded, and how can I consistently populate them?

EF Core のナビゲーション プロパティの null 値の問題と解決策の遅延読み込み

問題の説明

次のモデルを考えてみましょう:

<code class="language-csharp">public class Mutant
{
    public long Id { get; set; }
    public long OriginalCodeId { get; set; }
    public virtual OriginalCode OriginalCode { get; set; }
}

public class OriginalCode
{
    public long Id { get; set; }
    public virtual List<Mutant> Mutants { get; set; }
}</code>

DbContext の OnModelCreating メソッドで関係を定義します:

<code class="language-csharp">modelBuilder.Entity<Mutant>()
    .HasOne(m => m.OriginalCode)
    .WithMany(oc => oc.Mutants)
    .HasForeignKey(m => m.OriginalCodeId)
    .OnDelete(DeleteBehavior.Restrict);</code>

Mutant をクエリする場合、OriginalCode プロパティは最初は空です。ただし、Mutant をクエリする前に OriginalCode をクエリすると、OriginalCode 属性が設定されます。

原因分析

この動作は、EF Core ドキュメントの「関連データの読み込み」セクションに記載されています。

Entity Framework Core は現在、遅延読み込みをサポートしていないため、通常、プリロードまたは明示的に読み込むまで、ナビゲーション プロパティは空になります。

ただし、「プリロード」セクションには次の内容が含まれます:

ヒント Entity Framework Core は、以前にコンテキスト インスタンスに読み込まれた他のエンティティのナビゲーション プロパティを自動的に修正します。したがって、ナビゲーション プロパティのデータを明示的に含めない場合でも、関連するエンティティの一部またはすべてが以前に読み込まれていれば、プロパティに値が設定される可能性があります。

解決策

最初の問題を解決します (ナビゲーション属性が空です):

プリロードなど、関連データをロードする利用可能な方法を使用します。

<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>

2 番目の問題 (関連エンティティのプリロードによりナビゲーション プロパティが設定される) を修正します:

この動作は「仕様」であり、制御できません。この問題を回避するには:

  • クエリごとに新しい DbContext インスタンスを使用します。
  • 追跡クエリを使用しません (AsNoTracking())。

EF Core v2.1 以降の更新プログラム:

EF Core v2.1 は遅延読み込みをサポートしていますが、デフォルトでは有効になっていません。有効にするには:

  • すべてのナビゲーション プロパティを virtual でマークします。
  • Microsoft.EntityFrameworkCore.Proxies NuGet パッケージをインストールします。
  • 遅延読み込みを有効にするには、UseLazyLoadingProxies() を使用します。

上記のアプローチを使用すると、EF Core でのナビゲーション プロパティの読み込みを効果的に管理し、null 値の問題を回避し、コードの予測可能性を向上させることができます。

以上が明示的にロードされるまでEFコアナビゲーションプロパティがnullされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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