Entity Framework - หลาย DbContext

ในบทนี้เราจะเรียนรู้วิธีการย้ายการเปลี่ยนแปลงไปยังฐานข้อมูลเมื่อมี DbContext หลายคลาสในแอปพลิเคชัน

  • DbContext หลายตัวถูกนำมาใช้ครั้งแรกใน Entity Framework 6.0
  • หลายบริบทคลาสอาจเป็นของฐานข้อมูลเดียวหรือสองฐานข้อมูลที่แตกต่างกัน

ในตัวอย่างของเราเราจะกำหนดคลาสบริบทสองคลาสสำหรับฐานข้อมูลเดียวกัน ในรหัสต่อไปนี้มีคลาส DbContext สองคลาสสำหรับนักเรียนและครู

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

ดังที่คุณเห็นในโค้ดด้านบนมีสองโมเดลที่เรียกว่า "นักเรียน" และ "ครู" แต่ละคนมีความเกี่ยวข้องกับคลาสบริบทที่เกี่ยวข้องโดยเฉพาะกล่าวคือ Student เชื่อมโยงกับ MyStudentContext และ Teacher เชื่อมโยงกับ MyTeacherContext

นี่คือกฎพื้นฐานในการโอนย้ายการเปลี่ยนแปลงในฐานข้อมูลเมื่อมีคลาสบริบทหลายคลาสภายในโปรเจ็กต์เดียวกัน

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

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

  • อัพเดตฐานข้อมูล - คอนฟิกูเรชัน <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose

มาเปิดใช้งานการโอนย้ายสำหรับ MyStudentContext โดยดำเนินการคำสั่งต่อไปนี้ใน Package Manager Console

PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext

เมื่อดำเนินการแล้วเราจะเพิ่มโมเดลในประวัติการย้ายข้อมูลและสำหรับสิ่งนั้นเราต้องเริ่มคำสั่ง add-migration ในคอนโซลเดียวกัน

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

ตอนนี้ให้เราเพิ่มข้อมูลลงในตารางนักเรียนและครูในฐานข้อมูล

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

เมื่อดำเนินการโค้ดด้านบนคุณจะเห็นว่ามีการสร้างตารางที่แตกต่างกันสองตารางสำหรับโมเดลที่แตกต่างกันสองแบบดังที่แสดงในภาพต่อไปนี้

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น