私の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の違いだと感じています
ステートメントで包括的なレイジーロードを作成するか、レイジーロードを指定するための新しい形式を理解するのに、いくつかの助けが必要かもしれません。
カズ
したがって、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();
_
この方法の方が安全である理由がわかります。巨大なデータセットをロードしないと、処理が遅くなる可能性があります。しかし、私は彼らがレイジーロードをすぐに取り戻すことを望みます!!!
カズ
遅延読み込みがEF Core 2.1
で利用できるようになりました。関連ドキュメントへのリンクは次のとおりです:
https://docs.Microsoft.com/en-us/ef/core/querying/related-data#lazy-loading
このパッケージをインストールして、EF Core 2.1で遅延読み込みを有効にすることができます。
Microsoft.EntityFrameworkCore.Proxies
次に、この構成をef dbContextに設定します
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer("myConnectionString");
「注意」このパッケージは、EF Core 2.1以降でのみ機能します。
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);
});
プレリリースバージョン があり、間もなくフルリリースで利用できるようになるはずです。
いくつかの注意事項:
この行は、データコンテキストでOnConfiguringに組み込まれます。
optionsBuilder.UseLazyLoadingProxies();
LazyLoadingはEF Coreではまだサポートされていませんが、LazyLoadingを有効にする非公式のライブラリがあります: https://github.com/darxis/EntityFramework.LazyLoading 。正式にサポートされるまで使用できます。 EF Core v1.1.1をサポートしています。 nugetパッケージとして利用できます: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/
免責事項:私はこのリポジトリの所有者であり、試してみたり、問題を報告したり、貢献したりすることを勧めます。
レイジーロードはEFコア2.1に組み込まれる予定です。これが必須の機能である理由について詳しくは、 here を参照してください。