顯式加載所有導航屬性

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 Core。

EntityFramework Eager加載所有導航屬性

一般承認的答案

正如評論中所提到的,我相當自信(儘管我對EF Core的使用有限),這不能通過導航屬性的標準映射自動完成。使用.Load也比使用.Include效率低(並且更長),因為您將運行多個查詢,就像使用延遲加載導航屬性本身一樣。

根據你的問題,我可以通過兩種方式來解決每次不希望進行檢查的問題。第一個可以專門用於加載您的Blog實體,第二個可以重複使用,但仍然需要更改您的加載。

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow