Entity Framework - Mehrfacher DbContext

In diesem Kapitel erfahren Sie, wie Sie Änderungen in die Datenbank migrieren, wenn die Anwendung mehrere DbContext-Klassen enthält.

  • Multiple DbContext wurde erstmals in Entity Framework 6.0 eingeführt.
  • Mehrere Kontextklassen können zu einer einzelnen Datenbank oder zu zwei verschiedenen Datenbanken gehören.

In unserem Beispiel definieren wir zwei Kontextklassen für dieselbe Datenbank. Im folgenden Code gibt es zwei DbContext-Klassen für Schüler und Lehrer.

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

Wie Sie im obigen Code sehen können, gibt es zwei Modelle mit den Namen "Schüler" und "Lehrer". Jeder ist einer bestimmten entsprechenden Kontextklasse zugeordnet, dh Schüler ist MyStudentContext und Lehrer ist MyTeacherContext zugeordnet.

Hier ist die Grundregel zum Migrieren von Änderungen in der Datenbank, wenn mehrere Kontextklassen innerhalb desselben Projekts vorhanden sind.

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

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

  • Update-Datenbank-Konfiguration <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose

Aktivieren Sie die Migration für MyStudentContext, indem Sie den folgenden Befehl in der Package Manager-Konsole ausführen.

PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext

Sobald es ausgeführt wird, fügen wir das Modell in den Migrationsverlauf ein und müssen dafür den Befehl add-migration in derselben Konsole auslösen.

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

Fügen wir nun einige Daten zu den Schüler- und Lehrertabellen in der Datenbank hinzu.

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

Wenn der obige Code ausgeführt wird, werden Sie sehen, dass zwei verschiedene Tabellen für zwei verschiedene Modelle erstellt werden, wie in der folgenden Abbildung gezeigt.

Wir empfehlen, dass Sie das obige Beispiel zum besseren Verständnis Schritt für Schritt ausführen.