Khung thực thể - Nhiều DbContext

Trong chương này, chúng ta sẽ học cách di chuyển các thay đổi vào cơ sở dữ liệu khi có nhiều lớp DbContext trong ứng dụng.

  • Nhiều DbContext lần đầu tiên được giới thiệu trong Entity Framework 6.0.
  • Nhiều lớp ngữ cảnh có thể thuộc về một cơ sở dữ liệu duy nhất hoặc hai cơ sở dữ liệu khác nhau.

Trong ví dụ của chúng tôi, chúng tôi sẽ xác định hai lớp Ngữ cảnh cho cùng một cơ sở dữ liệu. Trong đoạn mã sau, có hai lớp DbContext cho Sinh viên và Giáo viên.

public class Student {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
}

public class MyStudentContext : DbContext {
   public MyStudentContext() : base("UniContextDB") {}
   public virtual DbSet<Student> Students { get; set; }
}

public class Teacher {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime HireDate { get; set; }
}

public class MyTeacherContext : DbContext {
   public MyTeacherContext() : base("UniContextDB") {}
   public virtual DbSet<Teacher> Teachers { get; set; }
}

Như bạn có thể thấy trong đoạn mã trên, có hai mô hình được gọi là “Sinh viên” và “Giáo viên”. Mỗi người được liên kết với một lớp ngữ cảnh tương ứng cụ thể, tức là Sinh viên được liên kết với MyStudentContext và Giáo viên được liên kết với MyTeacherContext.

Đây là quy tắc cơ bản để di chuyển các thay đổi trong cơ sở dữ liệu, khi có nhiều lớp Ngữ cảnh trong cùng một dự án.

  • enable-migrations -ContextTypeName <DbContext-Name-with-Namespaces> MigrationsDirectory: <Migrations-Directory-Name>

  • Add-Migration -configuration <DbContext-Migrations-Configuration-Class-withNamespaces> <Migrations-Name>

  • Cập nhật-Cơ sở dữ liệu -cấu hình <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose

Hãy kích hoạt tính năng di chuyển cho MyStudentContext bằng cách thực hiện lệnh sau trong Bảng điều khiển Trình quản lý Gói.

PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext

Khi nó được thực thi, chúng tôi sẽ thêm mô hình vào lịch sử di chuyển và để làm điều đó, chúng tôi phải kích hoạt lệnh bổ sung di chuyển trong cùng một bảng điều khiển.

PM→ add-migration -configuration EFCodeFirstDemo.Migrations.Configuration Initial

Bây giờ chúng ta hãy thêm một số dữ liệu vào bảng Học sinh và Giáo viên trong cơ sở dữ liệu.

static void Main(string[] args) {

   using (var context = new MyStudentContext()) {
	
      //// Create and save a new Students
      Console.WriteLine("Adding new students");

      var student = new Student {
         FirstMidName = "Alain", 
         LastName = "Bomer", 
         EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         //Age = 24
      };

      context.Students.Add(student);

      var student1 = new Student {
         FirstMidName = "Mark",
         LastName = "Upston", 
         EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         //Age = 30
      };

      context.Students.Add(student1);
      context.SaveChanges();
		
      // Display all Students from the database
      var students = (from s in context.Students orderby s.FirstMidName
         select s).ToList<Student>();
		
      Console.WriteLine("Retrieve all Students from the database:");

      foreach (var stdnt in students) {
         string name = stdnt.FirstMidName + " " + stdnt.LastName;
         Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
      }

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

   using (var context = new MyTeacherContext()) {

      //// Create and save a new Teachers
      Console.WriteLine("Adding new teachers");

      var student = new Teacher {
         FirstMidName = "Alain", 
         LastName = "Bomer", 
         HireDate = DateTime.Parse(DateTime.Today.ToString())
         //Age = 24
      };

      context.Teachers.Add(student);

      var student1 = new Teacher {
         FirstMidName = "Mark", 
         LastName = "Upston", 
         HireDate = DateTime.Parse(DateTime.Today.ToString())
         //Age = 30
      };

      context.Teachers.Add(student1);
      context.SaveChanges();
  
      // Display all Teachers from the database
      var teachers = (from t in context.Teachers orderby t.FirstMidName
         select t).ToList<Teacher>();
		
      Console.WriteLine("Retrieve all teachers from the database:");

      foreach (var teacher in teachers) {
         string name = teacher.FirstMidName + " " + teacher.LastName;
         Console.WriteLine("ID: {0}, Name: {1}", teacher.ID, name);
      }

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

Khi đoạn mã trên được thực thi, bạn sẽ thấy hai bảng khác nhau được tạo cho hai mô hình khác nhau như thể hiện trong hình sau.

Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.