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 番目の問題 (関連エンティティのプリロードによりナビゲーション プロパティが設定される) を修正します:
この動作は「仕様」であり、制御できません。この問題を回避するには:
AsNoTracking()
)。 EF Core v2.1 以降の更新プログラム:
EF Core v2.1 は遅延読み込みをサポートしていますが、デフォルトでは有効になっていません。有効にするには:
virtual
でマークします。 Microsoft.EntityFrameworkCore.Proxies
NuGet パッケージをインストールします。 UseLazyLoadingProxies()
を使用します。 上記のアプローチを使用すると、EF Core でのナビゲーション プロパティの読み込みを効果的に管理し、null 値の問題を回避し、コードの予測可能性を向上させることができます。
以上が明示的にロードされるまでEFコアナビゲーションプロパティがnullされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。