Учебники

Entity Framework — База данных семян

В Entity Framework Seed был представлен в EF 4.1 и работает с инициализаторами базы данных. Общая идея Seed Method заключается в инициализации данных в базе данных, которая создается Code First или развивается посредством Migrations. Эти данные часто являются тестовыми данными, но также могут быть справочными данными, такими как списки известных студентов, курсы и т. Д. Когда данные инициализируются, они выполняют следующее:

  • Проверяет, существует ли целевая база данных.
  • Если это так, то текущая модель Code First сравнивается с моделью, хранящейся в метаданных в базе данных.
  • База данных удаляется, если текущая модель не соответствует модели в базе данных.
  • База данных создается, если она была отброшена или вообще не существовала.
  • Если база данных была создана, то вызывается метод Seed инициализатора.

Метод Seed принимает объект контекста базы данных в качестве входного параметра, а код в методе использует этот объект для добавления новых объектов в базу данных. Чтобы заполнить данные в вашей базе данных, вам нужно переопределить метод Seed. Давайте рассмотрим следующий пример, в котором некоторые данные по умолчанию инициируются в базе данных во внутреннем классе.

private class UniDBInitializer<T> : DropCreateDatabaseAlways<MyContext> {

   protected override void Seed(MyContext context) {

      IList<Student> students = new List<Student>();

      students.Add(new Student() {
         FirstMidName = "Andrew", 
         LastName = "Peters", 
         EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
      });

      students.Add(new Student() {
         FirstMidName = "Brice", 
         LastName = "Lambson", 
         EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
      });

      students.Add(new Student() {
         FirstMidName = "Rowan", 
         LastName = "Miller", 
         EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
      });

      foreach (Student student in students)
      context.Students.Add(student);
      base.Seed(context);
   }
}

В приведенном выше коде таблица ученика инициализируется. Вам необходимо установить этот класс инициализатора БД в классе контекста, как показано в следующем коде.

public MyContext() : base("name=MyContextDB") {
   Database.SetInitializer<MyContext>(new UniDBInitializer<MyContext>());
}

Ниже приведена полная реализация класса MyContext, который также содержит класс инициализатора БД.

public class MyContext : DbContext {

   public MyContext() : base("name=MyContextDB") {
      Database.SetInitializer<MyContext>(new UniDBInitializer<MyContext>());
   }

   public virtual DbSet<Course> Courses { get; set; }
   public virtual DbSet<Enrollment> Enrollments { get; set; }
   public virtual DbSet<Student> Students { get; set; }
	
   private class UniDBInitializer<T> : DropCreateDatabaseAlways<MyContext> {

      protected override void Seed(MyContext context) {

         IList<Student> students = new List<Student>();
			
         students.Add(new Student() {
            FirstMidName = "Andrew", 
            LastName = "Peters", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString()) 
         });

         students.Add(new Student() {
            FirstMidName = "Brice", 
            LastName = "Lambson", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         students.Add(new Student() {
            FirstMidName = "Rowan", 
            LastName = "Miller", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         foreach (Student student in students)
         context.Students.Add(student);
         base.Seed(context);
      }
   } 
}

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

Данные в базе данных

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