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.