Entity Framework: base de datos inicial

En Entity Framework, Seed se introdujo en EF 4.1 y funciona con inicializadores de base de datos. La idea general de unSeed Methodconsiste en inicializar datos en una base de datos que Code First está creando o evolucionada por Migrations. Estos datos suelen ser datos de prueba, pero también pueden ser datos de referencia, como listas de Estudiantes, Cursos, etc. conocidos. Cuando se inicializan los datos, hace lo siguiente:

  • Comprueba si la base de datos de destino ya existe.
  • Si es así, el modelo actual de Code First se compara con el modelo almacenado en metadatos en la base de datos.
  • La base de datos se descarta si el modelo actual no coincide con el modelo de la base de datos.
  • La base de datos se crea si se eliminó o no existió en primer lugar.
  • Si se creó la base de datos, se llama al método inicializador Seed.

El método Seed toma el objeto de contexto de la base de datos como parámetro de entrada y el código del método usa ese objeto para agregar nuevas entidades a la base de datos. Para generar datos en su base de datos, debe anular el método Seed. Echemos un vistazo al siguiente ejemplo en el que algunos de los datos predeterminados se inician en la base de datos en una clase 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);
   }
}

En el código anterior, se inicializa la tabla de estudiantes. Debe configurar esta clase de inicializador de base de datos en la clase de contexto como se muestra en el siguiente código.

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

A continuación se muestra la implementación de clase completa de la clase MyContext, que también contiene la clase de inicializador de base de datos.

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

Cuando se compila y ejecuta el ejemplo anterior, puede ver los datos en una base de datos como se muestra en la siguiente imagen.

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