有沒有什麼辦法可以在本地緩存表?
這是默認情況下DbContext
所做的,並且您可以輕鬆使用該功能。以下是基本模式:
context.Products.Where(p => <some intial condion>).Load();
var dataSource = context.Product.Local.Where(p => <some flexible condition>);
請注意,在第2行使用Local
集合。這是一個DbSet
屬性,它從上下文的緩存中返回實體。
與合作導航屬性
了由Load()
聲明加載將由關係修正自動連接到彼此的任何相關實體。因此,如果一個Product
具有收藏Components
,你可以這樣做:
context.Components.Where(c => <some intial condion>).Load();
如果這是加載了上述裝載產品的所有組件,你會看到他們的Components
收集現在填充。
組合這兩個步驟的另一種方法是:
context.Products.Where(p => <some intial condion>)
.Include(p => p.Components)
.Load();
如果有很多相關的表,你必須要找到個人Load
報表和Load
語句與Include
之間的平衡,因爲許多Includes
在一個聲明中可能會碰到的性能。
並且仍然使用LINQ進行選擇
如上所示:柔性狀態。
不會產生數據庫
任何請求。如果你將永遠解決Local
集合而已,這些語句將永遠不會查詢數據庫。但是,解決導航屬性可能仍會導致延遲加載。如果你這樣做......
context.Products.Where().Load();
context.Components.Where().Load();
...這確實填充product.Components
集合,但由於裝載,而context.Products.Include(p => p.Components)
不並不標誌着他們。所以在第一種情況下,尋址product.Components
將觸發延遲加載。同樣,解決實體未加載的導航屬性也會觸發延遲加載。所以要絕對確保沒有數據庫的交互被觸發時,應禁用延遲加載,無論是...
context.Configuration.LazyLoadingEnabled = false;
......或者......
context.Configuration.ProxyCreationEnabled = false;
後者選項強制EF到創建不能延遲加載的簡單POCO對象。
因此,使用這些技術,您可以將您的上下文用作連接實體的本地緩存。對於上下文應該是短暫的規則,這是一個例外。
一個警告
關係修正doesn't work for many-to-many associations。假設有Product
和Manufacturer
,然後之間的關係m:n
...
context.Products.Where().Load();
context.Manufacturers.Where().Load();
......不會填充product.Manufacturers
和manufacturer.Products
。多對多的關聯應該由Include
加載:
context.Products.Where()
.Include(p => p.Manufacturers)
.Load();
我想你應該顯示一些你的代碼。聽起來像一個簡單的ToList()在將它提交給組合框和數據網格(有效地從EF linq切換到內存中的linq)之前,可能會對解決您的問題有很大的幫助。 –
獲取對象後,不必使用EntityFramework(EF)。它僅僅是一個獲取數據的對象模型層。由於EF將數據庫客觀化爲數據檢索,因此LINQ與EF分離。您可以簡單地設置一個存儲庫模式,您可以在設置的持續時間內執行檢索方法並緩存這些對象。我可以很容易地做var ls = new List {「a」,「b」,「c」,「d」,「e」}。 (2).Take(3).ToList()。ForEach(x => Console.WriteLine($「I have {x}」)); EF對Linq沒有任何影響,它的用途是,LINQ是一個查詢擴展方法的框架,EF是用於數據複製的。 –
djangojazz
另外你在這裏碰到了一個問題:'但是使用那些生成的類真的很方便。 T4模板(產生這些類的東西)是EF真正照亮了IMHO的地方。如果需要,您可以覆蓋寫入代碼的代碼,也可以生成生成的數據。 EG:假設我有一個桌子的顏色:它只存儲一個ID和值「紅色」,「藍色」,「黃色」。檢索這將是一種愚蠢的,所以我甚至可以破解T4來生成數據庫中的枚舉生成對象。由於數據庫更改需要重新運行T4模板,可能不適合生產。 – djangojazz