我正在構建一個基本的MVC核心Web API並嘗試使用實體框架進行連接,我遇到了一個名爲「Lazy Loading」的問題,似乎無法將我的頭圍繞着Lazy Loading是否正在循環EntityFramework?延遲加載示例?
什麼時候使用延遲加載,它如何受益?
我正在構建一個基本的MVC核心Web API並嘗試使用實體框架進行連接,我遇到了一個名爲「Lazy Loading」的問題,似乎無法將我的頭圍繞着Lazy Loading是否正在循環EntityFramework?延遲加載示例?
什麼時候使用延遲加載,它如何受益?
在我看來,延遲加載是從數據庫中自動加載實體或實體集合時的過程。
實際上,排序和檢索算法正在用戶端應用,而查詢獲取所有數據。默認情況下,「延遲加載」功能處於ON狀態,但可以手動關閉,也可以構建巧妙的查詢,即使用IQueryable,它在服務器端執行篩選並僅檢索所需的記錄。在做法,它會幫你節省大量的時間和資源,通過防止交通擁擠和重載服務器
更好的答案是在這個網站 - > https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
謝謝!這就是我一直在尋找一個簡單的工作方式,這對我來說是一個新的領域,所以我只想確保我做對了。 – ARLCode
惰性加載意味着延遲相關數據的加載,直到你專門爲它要求。例如,Student
類包含StudentAddress
作爲一個複雜的屬性。因此,上下文首先從數據庫加載所有students
,然後當我們訪問StudentAddress
屬性時,它將加載特定student
的地址,如下所示。
using (var ctx = new SchoolDBEntities())
{
//Loading students only
IList<Student> studList = ctx.Students.ToList<Student>();
Student std = studList[0];
//Loads Student address for particular Student only (seperate SQL query)
StudentAddress address = std.StudentAddress;
}
上面顯示的代碼將導致兩個SQL查詢。首先,它會獲取所有students
:
SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
然後,當控制達到以下行:
StudentAddress address = std.StudentAddress;
EF將發送第二查詢數據庫加載StudentAddress
:
exec sp_executesql N'SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[Address1] AS [Address1],
[Extent1].[Address2] AS [Address2],
[Extent1].[City] AS [City],
[Extent1].[State] AS [State]
FROM [dbo].[StudentAddress] AS [Extent1]
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
規則對於延遲加載:
context.Configuration.ProxyCreationEnabled
應該是true。context.Configuration.LazyLoadingEnabled
應該是正確的。導航public
,virtual
。如果該屬性未被定義爲虛擬(在這種情況下StudentAddress
應該是virtual
),則上下文不會執行延遲加載 。
[延遲加載VS預先加載的可能的複製](http://stackoverflow.com/questions/31366236/lazy-loading-vs-eager-loading) –