Учебники

Entity Framework — множественный DbContext

В этой главе мы научимся переносить изменения в базу данных, когда в приложении имеется несколько классов DbContext.

  • Множественный DbContext был впервые представлен в Entity Framework 6.0.
  • Несколько классов контекста могут принадлежать одной базе данных или двум различным базам данных.

В нашем примере мы определим два класса Context для одной и той же базы данных. В следующем коде есть два класса 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.

Вот основное правило для переноса изменений в базе данных, когда в одном проекте несколько классов Context.

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

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

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

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

Add-Migration -configuration <DbContext-Migrations-Configuration-Class-with -Namespaces> <Migrations-Name>

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

Давайте включим миграцию для MyStudentContext, выполнив следующую команду в консоли диспетчера пакетов.

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

Когда приведенный выше код будет выполнен, вы увидите, что для двух разных моделей созданы две разные таблицы, как показано на следующем рисунке.

Исполняемый код

Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.