Entity Framework - Plusieurs DbContext

Dans ce chapitre, nous allons apprendre à migrer les modifications dans la base de données lorsqu'il y a plusieurs classes DbContext dans l'application.

  • Multiple DbContext a été introduit pour la première fois dans Entity Framework 6.0.
  • Plusieurs classes de contexte peuvent appartenir à une seule base de données ou à deux bases de données différentes.

Dans notre exemple, nous définirons deux classes de contexte pour la même base de données. Dans le code suivant, il existe deux classes DbContext pour Student et Teacher.

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

Comme vous pouvez le voir dans le code ci-dessus, il existe deux modèles appelés «étudiant» et «enseignant». Chacun est associé à une classe de contexte correspondante particulière, c'est-à-dire que Student est associé à MyStudentContext et Teacher est associé à MyTeacherContext.

Voici la règle de base pour migrer les modifications dans la base de données, lorsqu'il existe plusieurs classes de contexte dans le même projet.

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

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

  • Update-Database -configuration <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose

Activons la migration pour MyStudentContext en exécutant la commande suivante dans la console du gestionnaire de package.

PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext

Une fois qu'il sera exécuté, nous ajouterons le modèle dans l'historique de migration et pour cela, nous devons lancer la commande add-migration dans la même console.

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

Ajoutons maintenant des données dans les tableaux Elèves et Professeurs de la base de données.

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

Lorsque le code ci-dessus est exécuté, vous verrez que deux tables différentes sont créées pour deux modèles différents, comme illustré dans l'image suivante.

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.