Entity Framework: varios DbContext

En este capítulo, aprenderemos cómo migrar cambios a la base de datos cuando hay varias clases DbContext en la aplicación.

  • Multiple DbContext se introdujo por primera vez en Entity Framework 6.0.
  • Varias clases de contexto pueden pertenecer a una sola base de datos o dos bases de datos diferentes.

En nuestro ejemplo, definiremos dos clases de contexto para la misma base de datos. En el siguiente código, hay dos clases de DbContext para Student y 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; }
}

Como puede ver en el código anterior, hay dos modelos llamados “Estudiante” y “Profesor”. Cada uno está asociado con una clase de contexto correspondiente en particular, es decir, el alumno está asociado con MyStudentContext y el profesor está asociado con MyTeacherContext.

Esta es la regla básica para migrar cambios en la base de datos, cuando hay varias clases de contexto dentro del mismo proyecto.

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

  • Agregar-Migración -configuración <DbContext-Migrations-Configuration-Class-withNamespaces> <Migrations-Name>

  • Actualizar-Base de datos -configuración <DbContext-Migrations-Configuration-Class-withNamespaces> -Verbose

Habilitemos la migración para MyStudentContext ejecutando el siguiente comando en Package Manager Console.

PM→ enable-migrations -ContextTypeName:EFCodeFirstDemo.MyStudentContext

Una vez ejecutado, agregaremos el modelo en el historial de migración y para eso, tenemos que disparar el comando add-migration en la misma consola.

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

Agreguemos ahora algunos datos a las tablas de Estudiantes y Maestros en la base de datos.

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

Cuando se ejecuta el código anterior, verá que se crean dos tablas diferentes para dos modelos diferentes como se muestra en la siguiente imagen.

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.