深入理解 EF Core:EF Core 讀取資料時發生了什麼?
阿新 • • 發佈:2020-06-17
閱讀本文大概需要 11 分鐘。
> 原文:[https://bit.ly/2UMiDLb](https://bit.ly/2UMiDLb) > 作者:Jon P Smith > 翻譯:王亮 > 宣告:我翻譯技術文章不是逐句翻譯的,而是根據我自己的理解來表述的。其中可能會去除一些本人實在不知道如何組織但又不影響理解的句子。 本文將為你詳細描繪 EF Core 從資料庫中讀取資料的“幕後”檢視。我將揭開兩種資料庫讀取方式的面紗:一個是普通的查詢,另一個是使用 AsNoTracking 方法的非跟蹤查詢。我還將通過一個實驗來演示我是如何解決我的一個客戶遇到的效能問題。 我假設你對 EF Core 已經有了一定的認識,但在深入學習之前,我們先來了解一下如何使用 EF Core,以確保我們已經掌握了一些基本知識。這是一個“深入研究”的課題,所以我準備大量的技術細節,希望我的描述方式你能理解。 本文是“深入理解 EF Core”系列中的第一篇。以下是本系列文章列表: - 當 EF Core 從資料庫讀取資料時發生了什麼?(本文) - 當 EF Core 寫入資料到資料庫時發生了什麼?(敬請期待) ## 概要 - EF Core 有兩種方法從資料庫中讀取資料(也稱為查詢):普通 LINQ 查詢和包含 AsNoTracking 方法的非跟蹤 LINQ 查詢。 - 這兩種方法查詢的返回類(被稱為實體類),它連線的其它的實體類(即所謂的導航屬性)也被同時載入,但這兩種法如何連線及連線的內容是不一樣的。 - 普通查詢接受的是 DbContext 執行讀取時所有資料的副本——此時的實體類稱為被跟蹤。這允許載入的實體類參與資料庫的更新操作。 - 普通查詢還會有一些其它的複雜底層實現,稱為關係修補(fixup),用於描述讀入的實體類和其他被跟蹤實體之間的連線關係。 - AsNoTracked 非跟蹤查詢沒有副本,所以它沒有被跟蹤——這意味著它比普通查詢更快。這也意味著它不會用於資料庫的寫操作。 - 最後,我將展示 EF Core 普通查詢中一個鮮為人知的特性,以此作為示例,說明通過導航屬性連線實體類的關係是多麼智慧。 ## EF Core 如何讀取資料庫資料 提示:如果你已經對 EF Core 有一定的認識,那麼你可以跳過這一節,這部分只是一個如何讀取資料庫的例子。 為了能讓你更好地理解,我先描述一個數據庫結構,然後再給出一個簡單的資料庫讀取示例。下面是一些基本表的結構和它們之間的關係。 ![ ](http://qn-tc.geekgist.com/202006/17085341) 這些表被對映到具有類似名稱的類,例如 Book、BookAuthor、Author,這些類的屬性名稱與表的欄位名稱相同。由於篇幅有限,我不打算展開來講這些類,但您可以在我的 GitHub 倉庫[1]