使用 DbContext
若要使用 Entity Framework 使用 .NET 物件來查詢、插入、更新和刪除資料,您必須先 建立模型 ,以將模型中定義的實體和關聯性對應至資料庫中的資料表。
一旦您有模型,應用程式所互動的主要類別就是 System.Data.Entity.DbContext
(通常稱為內容類別別)。 您可以使用與模型相關聯的 DbCoNtext 來:
- 撰寫和執行查詢
- 將查詢結果具體化為實體物件
- 追蹤對這些物件所做的變更
- 將物件變更保留回資料庫
- 將記憶體中的物件系結至 UI 控制項
此頁面提供如何管理內容類別別的一些指引。
定義 DbCoNtext 衍生類別
使用內容的建議方式是定義衍生自 DbCoNtext 的類別,並公開代表內容中指定實體集合的 DbSet 屬性。 如果您使用 EF 設計工具,將會為您產生內容。 如果您使用 Code First,您通常會自行撰寫內容。
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
當您有內容之後,您可以透過這些屬性來查詢、新增(使用 Add
或 Attach
方法)或移除 Remove
內容中的實體。 DbSet
存取內容物件上的屬性代表會傳回指定類型之所有實體的起始查詢。 請注意,只要存取屬性就不會執行查詢。 查詢會在下列情況下執行:
- 它是由
foreach
(C#) 或For Each
(Visual Basic) 陳述式所列舉。 - 集合作業會列舉它,例如
ToArray
、ToDictionary
或ToList
。 - LINQ 運算子,例如
First
或Any
是在查詢的最外層指定。 - 下列其中一個方法稱為:如果內容中找不到具有指定索引鍵的實體,則會
Load
呼叫擴充方法 、DbEntityEntry.Reload
Database.ExecuteSqlCommand
和DbSet<T>.Find
。
存留期
內容的存留期會在建立實例時開始,並在處置或垃圾收集實例時結束。 如果您想要在區塊結尾處置內容控制項的所有資源,請使用 using 。 當您使用 時 ,編譯器會自動建立 try/finally 區塊,並在 finally 區塊中 呼叫 dispose。
public void UseProducts()
{
using (var context = new ProductContext())
{
// Perform data access using the context
}
}
以下是決定內容存留期時的一些一般指導方針:
- 使用 Web 應用程式時,請使用每個要求的內容實例。
- 使用 Windows Presentation Foundation (WPF) 或 Windows Forms 時,請使用每個表單的內容實例。 這可讓您使用內容所提供的變更追蹤功能。
- 如果內容實例是由相依性插入容器所建立,通常是容器負責處置內容。
- 如果在應用程式程式碼中建立內容,請記得在不再需要內容時處置內容。
- 使用長時間執行的內容時,請考慮下列事項:
- 當您將更多物件及其參考載入記憶體時,內容的記憶體耗用量可能會快速增加。 這可能會導致效能問題。
- 內容不是安全線程,因此不應該在多個執行緒上同時執行工作。
- 如果例外狀況導致內容處於無法復原的狀態,整個應用程式可能會終止。
- 當查詢資料與更新資料之間的時間差距增加時,遇到並行相關問題的機率也會增加。
連線
根據預設,內容會管理資料庫的連線。 內容會視需要開啟並關閉連線。 例如,內容會開啟連接以執行查詢,然後在處理所有結果集時關閉連接。
在某些情況下,您會想要擁有更大的控制權來控制何時開啟及關閉連接。 例如,使用 SQL Server Compact 時,通常建議在應用程式的存留期內維護與資料庫的個別開啟連線,以改善效能。 您可以使用 Connection
屬性來手動管理這個處理序。