すべてのナビゲーションプロパティを明示的に読み込む

c# entity-framework-core

質問

EF Coreは最近、オブジェクトのナビゲーションプロパティを明示的にロードしました。

using (var db = new BloggingContext()) {
    var blog = db.Blogs.Find(1);

    db.Entry(blog).Collection(b => b.Posts).Load();
    db.Entry(blog).Reference(b => b.Author).Load();
}

https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/

これは明らかに冗長であり、私は毎回これらのチェックをしたくありません。これらの欠点を回避するための拡張メソッドや補完的なNuGetパッケージはありますか?

これはよくある質問ですが、EFコアではありません。

EntityFramework Eagerすべてのナビゲーションプロパティをロードする

受け入れられた回答

コメントで述べたように、私はかなり自信があります(私のEFコアの使用は限られていますが)。これは、ナビゲーションプロパティの標準的なマッピングによって自動的に実行できないということです。また、 .Loadを使用すると、レイジーローディングナビゲーションプロパティ自体を使用するのと同じように、複数のクエリを実行するように.Includeを使用するよりも、効率が悪く(またはるかに長い)。

質問ごとに毎回チェックをしたくないという問題に、私が考えることができる2つの方法があります。最初はBlogエンティティの読み込みには特に役立ちますが、もう1つは他のユーザーに再利用できるが、読み込みに変更が必要です。

1;すべての関連エンティティをロードするための拡張メソッド。

public static IQueryable<Blog> EagerWhere(this DbSet<Blogs> dbset, Expression<Func<Blog, bool>> expr) {
    return dbset
        .Include(m => m.Posts)
        .Include(m => m.Author)
        .Where(expr);
}

// .. usage

db.Blogs.EagerWhere(m => m.Id == 1);

(私はこれをEagerWhereと書いていますので、クエリをより詳細に制御できるので、単純なFind置換ではなく再利用が可能です)

2;カスタム属性を記述し、 .Find(..)と同じアクションを実行するが、Reflectionを使用してカスタム属性でプロパティを検索し、それらを.Include(..)再帰的に渡す、上記と同様のメソッドを記述します。

私は、(通常)限られた数のエンティティが作成されているため、その努力をする価値があるかどうかわからないので、その例を書いていません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ