實體框架 - 資料庫操作



在前面的章節中,您學習了三種不同的定義實體資料模型的方法。

  • 其中兩種,資料庫優先和模型優先,依賴於實體框架設計器以及程式碼生成。

  • 第三種,程式碼優先,允許您跳過視覺化設計器,只需編寫自己的程式碼。

  • 無論您選擇哪種路徑,最終都會得到領域類和一個或多個實體框架 DbContext 類,這些類允許您檢索和持久化與這些類相關的資料。

應用程式中的 DbContext API 用作類和資料庫之間的橋樑。DbContext 是實體框架中最重要的類之一。

  • 它能夠表達和執行查詢。

  • 它從資料庫獲取查詢結果並將其轉換為模型類的例項。

  • 它可以跟蹤對實體的更改,包括新增和刪除,然後觸發建立插入、更新和刪除語句,這些語句根據需要傳送到資料庫。

以下是我們將在本章中執行不同操作的領域和上下文類。這與我們在資料庫優先方法一章中建立的示例相同。

上下文類實現

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;

namespace DatabaseFirstDemo {

   public partial class UniContextEntities : DbContext {

      public UniContextEntities(): base("name = UniContextEntities") {}

      protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         throw new UnintentionalCodeFirstException();
      }

      public virtual DbSet<Course> Courses { get; set; }
      public virtual DbSet<Enrollment> Enrollments { get; set; }
      public virtual DbSet<Student> Students { get; set; }
   }
}

領域類實現

課程類

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic;
	
   public partial class Course {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Course() {
         this.Enrollments = new HashSet<Enrollment>();
      }
	
      public int CourseID { get; set; }
      public string Title { get; set; }
      public int Credits { get; set; }
	
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

學生類

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Student {

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]

      public Student() {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
			
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

註冊類

namespace DatabaseFirstDemo {

   using System;
   using System.Collections.Generic; 

   public partial class Enrollment {

      public int EnrollmentID { get; set; }
      public int CourseID { get; set; }
      public int StudentID { get; set; }
      public Nullable<int> Grade { get; set; }
		
      public virtual Course Course { get; set; }
      public virtual Student Student { get; set; }
   }
}

建立操作

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

class Program {

   static void Main(string[] args) {

      var newStudent = new Student();

      //set student name

      newStudent.FirstMidName = "Bill";
      newStudent.LastName = "Gates";
      newStudent.EnrollmentDate = DateTime.Parse("2015-10-21");
      newStudent.ID = 100;

      //create DBContext object

      using (var dbCtx = new UniContextEntities()) {

         //Add Student object into Students DBset
         dbCtx.Students.Add(newStudent);

         // call SaveChanges method to save student into database
         dbCtx.SaveChanges();
      }
   }
}

更新操作

更改現有物件就像更新分配給要更改的屬性的值並呼叫 SaveChanges 一樣簡單。例如,以下程式碼用於將 Ali 的姓氏從 Khan 更改為 Aslam。

using (var context = new UniContextEntities()) {

   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 的學生從資料庫中刪除的程式碼。

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

讀取操作

讀取資料庫中的現有資料非常簡單。以下是檢索 Student 表中所有資料的程式碼,然後程式將以字母順序顯示學生的姓名。

using (var db = new UniContextEntities()) {

   var query = from b in db.Students orderby b.FirstMidName select b;
   Console.WriteLine("All All student in the database:");

   foreach (var item in query) {
      Console.WriteLine(item.FirstMidName +" "+ item.LastName);
   }

   Console.WriteLine("Press any key to exit...");
   Console.ReadKey();
}
廣告