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

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

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