Khung thực thể - Hoạt động cơ sở dữ liệu

Trong các chương trước, bạn đã học ba cách khác nhau để xác định mô hình dữ liệu thực thể.

  • Hai trong số đó, Database First và Model First, phụ thuộc vào trình thiết kế Entity Framework kết hợp với việc tạo mã.

  • Phần thứ ba, Code First, cho phép bạn bỏ qua trình thiết kế trực quan và chỉ cần viết mã của riêng bạn.

  • Bất kể bạn chọn đường dẫn nào, bạn sẽ kết thúc với các lớp miền và một hoặc nhiều lớp DbContext của Entity Framework cho phép bạn truy xuất và lưu giữ dữ liệu liên quan đến các lớp đó.

API DbContext trong các ứng dụng của bạn được sử dụng làm cầu nối giữa các lớp và cơ sở dữ liệu của bạn. DbContext là một trong những lớp quan trọng nhất trong Khung thực thể.

  • Nó cho phép thể hiện và thực hiện các truy vấn.

  • Nó lấy kết quả truy vấn từ cơ sở dữ liệu và chuyển chúng thành các thể hiện của các lớp mô hình của chúng tôi.

  • Nó có thể theo dõi các thay đổi đối với các thực thể, bao gồm thêm và xóa, sau đó kích hoạt việc tạo các câu lệnh chèn, cập nhật và xóa được gửi đến cơ sở dữ liệu theo yêu cầu.

Sau đây là các lớp ngữ cảnh quảng cáo tên miền mà chúng tôi sẽ thực hiện các thao tác khác nhau trong chương này. Đây là ví dụ tương tự mà chúng tôi đã tạo trong chapater, Phương pháp tiếp cận cơ sở dữ liệu đầu tiên.

Triển khai lớp ngữ cảnh

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

Triển khai các lớp miền

Lớp học

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

Lớp học sinh

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

Lớp tuyển sinh

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

Tạo hoạt động

Thêm một đối tượng mới với Entity Framework cũng đơn giản như việc xây dựng một phiên bản mới của đối tượng của bạn và đăng ký nó bằng phương pháp Add trên DbSet. Đoạn mã sau cho phép bạn thêm một sinh viên mới vào cơ sở dữ liệu.

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();
      }
   }
}

Cập nhật hoạt động

Thay đổi các đối tượng hiện có đơn giản như cập nhật giá trị được gán cho (các) thuộc tính bạn muốn thay đổi và gọi SaveChanges. Ví dụ, đoạn mã sau được sử dụng để thay đổi họ của Ali từ Khan thành 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();
}

Xóa hoạt động

Để xóa một thực thể bằng Entity Framework, bạn sử dụng phương pháp Remove trên DbSet. Xóa tác phẩm cho cả thực thể hiện có và thực thể mới được thêm vào. Gọi Xóa trên một thực thể đã được thêm nhưng chưa được lưu vào cơ sở dữ liệu sẽ hủy bỏ việc thêm đối tượng. Thực thể bị xóa khỏi trình theo dõi thay đổi và không còn được DbContext theo dõi nữa. Việc gọi Xóa trên một thực thể hiện có đang được theo dõi thay đổi sẽ đăng ký thực thể để xóa vào lần gọi SaveChanges tiếp theo. Ví dụ sau đây là mã nơi sinh viên bị xóa khỏi cơ sở dữ liệu có tên là 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();
}

Đọc hoạt động

Đọc dữ liệu hiện có từ cơ sở dữ liệu rất đơn giản. Sau đây là đoạn mã trong đó tất cả dữ liệu từ bảng Sinh viên được truy xuất và sau đó một chương trình sẽ được hiển thị với họ và tên của sinh viên theo thứ tự bảng chữ cái.

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();
}