web-dev-qa-db-ja.com

Entity Framework Core-遅延読み込み

私のVisual Studiosのリクエストに応えて、Entity Framework Core(1.0.1)を使用して最新のプロジェクトを開始しました

したがって、常に「仮想」指定子を使用してリストの遅延読み込みを有効にしているので、データベースモデルを作成します。ただし、親テーブルをロードすると、子リストはロードされないように見えます。

親モデル

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}

子供モデル

public class EventInclusions
{
    [Key]
    public int EventIncSubID { get; set; }
    public string InclusionName { get; set; }
    public string InclusionDesc { get; set; }
    public Boolean InclusionActive { get; set; }

}

これらのテーブルに新しいレコードを追加すると、EventInclusionsレコードをイベントレコード内のリストとしてネストできる場所に慣れているので、うまくいくようです。

このテーブルをクエリすると

_context.Events.Where(e => e.EventName == "Test")

問題

EventInclusionsは、背後のデータに関係なくnull値を返します。

少し読んだ後、これは私が通常使用しているEF6とEF Coreの違いだと感じています

ステートメントで包括的なレイジーロードを作成するか、レイジーロードを指定するための新しい形式を理解するのに、いくつかの助けが必要かもしれません。

カズ

36
Caz1224

したがって、EF Coreは現在、遅延読み込みをサポートしていないようです。その来るが、少し離れているかもしれません。

今のところ、他の誰かがこの問題に遭遇し、苦労している場合。以下はEager loadingの使用例です。これは今のところ使用する必要があるものです。

人物オブジェクトがあり、そのオブジェクトに別のテーブルの帽子のリストが含まれていたとしましょう。

書くのではなく

_var person = _context.Person.Where(p=> p.id == id).ToList();

person.Hats.Where(h=> h.id == hat).ToList();
_

書く必要があります

_var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();
_

そしてperson.Hats.Where(h=> h.id == hat).ToList();が機能します

複数のリストがある場合-インクルードをチェーンする

_var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets)
                            .Include(p=> p.Smiles).Where(p=> p.id == id).ToList();
_

この方法の方が安全である理由がわかります。巨大なデータセットをロードしないと、処理が遅くなる可能性があります。しかし、私は彼らがレイジーロードをすぐに取り戻すことを望みます!!!

カズ

35
Caz1224

遅延読み込みがEF Core 2.1で利用できるようになりました。関連ドキュメントへのリンクは次のとおりです:

https://docs.Microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

35
Elijah Lofgren

このパッケージをインストールして、EF Core 2.1で遅延読み込みを有効にすることができます。

Microsoft.EntityFrameworkCore.Proxies

次に、この構成をef dbContextに設定します

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     => optionsBuilder
           .UseLazyLoadingProxies()
           .UseSqlServer("myConnectionString");

「注意」このパッケージは、EF Core 2.1以降でのみ機能します。

20
pejman

EF Core 2.1以降の場合、

インストール:

 dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4 

次に、以下に示すようにStartup.csファイルを更新します。

using Microsoft.EntityFrameworkCore.Proxies;



services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
            {
                options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
                options.UseLazyLoadingProxies(true);
            });
7
Kowi

プレリリースバージョン があり、間もなくフルリリースで利用できるようになるはずです。

いくつかの注意事項:

  • 単純な型(つまり、他のクラス/テーブル)以外のすべてのデータプロパティは、パブリックバーチャルである必要があります(デフォルトのスキャフォールディングではありません)。
  • この行は、データコンテキストでOnConfiguringに組み込まれます。

        optionsBuilder.UseLazyLoadingProxies();
    
  • それは(現在)プレリリースなので、力があなたと共にあるかもしれません。
7
Eric

LazyLoadingはEF Coreではまだサポートされていませんが、LazyLoadingを有効にする非公式のライブラリがあります: https://github.com/darxis/EntityFramework.LazyLoading 。正式にサポートされるまで使用できます。 EF Core v1.1.1をサポートしています。 nugetパッケージとして利用できます: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

免責事項:私はこのリポジトリの所有者であり、試してみたり、問題を報告したり、貢献したりすることを勧めます。

4
Darxis

レイジーロードはEFコア2.1に組み込まれる予定です。これが必須の機能である理由について詳しくは、 here を参照してください。

3
baHI