2016-11-24 101 views
0

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 Load all Navigation Properties

+0

'.include(..)'不能在覈心中工作嗎?即。 'db.Blogs.Include(m => m.Posts).Include(m => m.Author).Find(1);' –

+0

是的,但我試圖解決明確指定我想要的實體。 https://docs.microsoft.com/en-us/ef/core/querying/related-data – wonea

+0

啊,對不起,所以你的問題是如何加載所有的模型導航道具。我誤解了標題,並試圖簡化它。我可以想出一個簡單的方法來做到這一點,反射,但不知道即使是舊的EF也有內置的方法。編輯:即使你鏈接到的問題將爲核心工作,因爲你仍然指定要加載的內容。編輯2:我可能是錯的,但我認爲'.include(..)'比單獨加載更快,因爲它們將形成初始查詢運行的一部分。 –

回答

1

正如在評論中提到,我相當有信心,(雖然我的EF核心的使用是有限的),這個不能自動通過導航性能的標準映射來完成。與使用.Include一樣,使用.Load效率更低(時間更長),因爲您將像運行延遲加載導航屬性本身一樣運行多個查詢。

有兩種方法我可以想到解決不希望每次按照您的問題進行檢查的問題。第一個將專門加載您的Blog實體,第二個可以在其他人中重複使用,但仍需要更改加載。

1;擴展方法加載所有相關實體,像這樣:

​​

(請注意,我寫這爲EagerWhere因此您可以查詢更多的控制權,以便它更可重複使用的,而不是一個簡單的Find更換)

2;編寫一個自定義屬性,然後編寫一個與上述類似的方法,執行與.Find(..)相同的操作,但使用反射來查找具有您的自定義屬性的屬性,並遞歸地將它們傳遞到.Include(..)

我不會寫一個例子,因爲我不確定這是值得的努力,由於(通常)創建的實體數量有限。

+0

Afaik dotnet核心不支持反射屬性信息。 – alanh

+0

@alanh嗯,我以爲是的。它確實缺少了一些東西,但沒有像這樣重要。但我不能肯定地說,自從RC2以來,我還沒有機會再次與Core交手。 –