Entity Framework - banco de dados de sementes

No Entity Framework, o Seed foi introduzido no EF 4.1 e funciona com inicializadores de banco de dados. A ideia geral de umSeed Methodé inicializar os dados em um banco de dados que está sendo criado pelo Code First ou desenvolvido por Migrations. Esses dados geralmente são dados de teste, mas também podem ser dados de referência, como listas de Alunos, Cursos, etc. Quando os dados são inicializados, ele faz o seguinte -

  • Verifica se o banco de dados de destino já existe ou não.
  • Em caso afirmativo, o modelo Code First atual é comparado com o modelo armazenado em metadados no banco de dados.
  • O banco de dados será eliminado se o modelo atual não corresponder ao modelo no banco de dados.
  • O banco de dados será criado se tiver sido eliminado ou se não existir.
  • Se o banco de dados foi criado, o método inicializador Seed é chamado.

O método Seed leva o objeto de contexto do banco de dados como um parâmetro de entrada, e o código no método usa esse objeto para adicionar novas entidades ao banco de dados. Para propagar dados em seu banco de dados, você precisa substituir o método de propagação. Vamos dar uma olhada no exemplo a seguir, no qual alguns dos dados padrão são iniciados no banco de dados em uma classe interna.

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

No código acima, a tabela do aluno é inicializada. Você precisa definir esta classe de inicializador de banco de dados na classe de contexto, conforme mostrado no código a seguir.

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

A seguir está a implementação completa da classe MyContext, que também contém a classe do inicializador DB.

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

Quando o exemplo acima é compilado e executado, você pode ver os dados em um banco de dados conforme mostrado na imagem a seguir.

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.