使用 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; }
}

當您有內容之後,您可以透過這些屬性來查詢、新增(使用 AddAttach 方法)或移除 Remove 內容中的實體。 DbSet存取內容物件上的屬性代表會傳回指定類型之所有實體的起始查詢。 請注意,只要存取屬性就不會執行查詢。 查詢會在下列情況下執行:

  • 它是由 foreach (C#) 或 For Each (Visual Basic) 陳述式所列舉。
  • 集合作業會列舉它,例如 ToArrayToDictionaryToList
  • LINQ 運算子,例如 FirstAny 是在查詢的最外層指定。
  • 下列其中一個方法稱為:如果內容中找不到具有指定索引鍵的實體,則會 Load 呼叫擴充方法 、 DbEntityEntry.ReloadDatabase.ExecuteSqlCommandDbSet<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 屬性來手動管理這個處理序。