實體框架 - DbContext



實體框架使您能夠使用稱為實體的公共語言執行時 (CLR) 物件查詢、插入、更新和刪除資料。實體框架將模型中定義的實體和關係對映到資料庫。它還提供以下功能:

  • 將從資料庫返回的資料具體化為實體物件
  • 跟蹤對物件進行的更改
  • 處理併發
  • 將物件更改傳播回資料庫
  • 將物件繫結到控制元件

負責以物件形式與資料互動的主要類是 System.Data.Entity.DbContext。DbContext API 並非作為 .NET Framework 的一部分發布。為了能夠更靈活、更頻繁地向 Code First 和 DbContext API 釋出新功能,實體框架團隊透過 Microsoft 的 NuGet 分發功能分發 EntityFramework.dll。

  • NuGet 允許您透過從 Web 直接將相關的 DLL 拉入您的專案來向您的 .NET 專案新增引用。

  • 一個名為庫包管理器 Visual Studio 擴充套件提供了一種簡單的方法,可以將合適的程式集從 Web 拉入您的專案。

DbContext
  • DbContext API 主要針對簡化與實體框架的互動。

  • 它還減少了您需要訪問的用於執行常用任務的方法和屬性的數量。

  • 在早期版本的實體框架中,這些任務通常難以發現和編碼。

  • 上下文類在執行時管理實體物件,包括使用來自資料庫的資料填充物件、更改跟蹤以及將資料持久化到資料庫。

定義 DbContext 派生類

使用上下文的首選方法是定義一個從 DbContext 派生的類,並公開表示上下文中指定實體集合的 DbSet 屬性。如果您正在使用 EF 設計器,則會為您生成上下文。如果您使用的是 Code First,則通常會自己編寫上下文。

以下程式碼是一個簡單的示例,它顯示 UniContext 是從 DbContext 派生的。

  • 您可以將自動屬性與 DbSet 一起使用,例如 getter 和 setter。

  • 它還使程式碼更加簡潔,但在您沒有其他邏輯要應用的情況下,您不需要將其用於建立 DbSet 的目的。

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • 以前,EDM 用於生成從 ObjectContext 類派生的上下文類。

  • 使用 ObjectContext 稍微複雜一些。

  • DbContext 是 ObjectContext 的一個包裝器,它實際上類似於 ObjectContext,並且在所有開發模型(如 Code First、Model First 和 Database First)中都非常有用且易於使用。

查詢

您可以使用三種類型的查詢,例如:

  • 新增新實體。
  • 更改或更新現有實體的屬性值。
  • 刪除現有實體。

新增新實體

使用實體框架新增新物件就像構造物件的例項並使用 DbSet 上的 Add 方法註冊它一樣簡單。以下程式碼用於將新學生新增到資料庫。

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

更改現有實體

更改現有物件就像更新分配給您想要更改的屬性的值並呼叫 SaveChanges 一樣簡單。在以下程式碼中,Ali 的姓氏已從 Khan 更改為 Aslam。

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

刪除現有實體

要使用實體框架刪除實體,您可以在 DbSet 上使用 Remove 方法。Remove 適用於現有實體和新新增的實體。對已新增但尚未儲存到資料庫的實體呼叫 Remove 將取消實體的新增。該實體將從更改跟蹤器中刪除,並且 DbContext 不再跟蹤該實體。對正在更改跟蹤的現有實體呼叫 Remove 將在下次呼叫 SaveChanges 時註冊該實體以進行刪除。以下示例顯示了從資料庫中刪除名為 Ali 的學生的例項。

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}
廣告