Entity Framework - Database seme

In Entity Framework, Seed è stato introdotto in EF 4.1 e funziona con gli inizializzatori di database. L'idea generale di un fileSeed Methodconsiste nell'inizializzare i dati in un database creato da Code First o sviluppato da Migrations. Questi dati sono spesso dati di test, ma possono anche essere dati di riferimento come elenchi di studenti noti, corsi, ecc. Quando i dati vengono inizializzati, esegue le seguenti operazioni:

  • Verifica se il database di destinazione esiste già o meno.
  • In caso affermativo, il modello Code First corrente viene confrontato con il modello archiviato nei metadati nel database.
  • Il database viene eliminato se il modello corrente non corrisponde al modello nel database.
  • Il database viene creato se è stato eliminato o non esisteva in primo luogo.
  • Se il database è stato creato, viene chiamato il metodo Seed dell'inizializzatore.

Il metodo Seed accetta l'oggetto contesto del database come parametro di input e il codice nel metodo utilizza quell'oggetto per aggiungere nuove entità al database. Per eseguire il seed dei dati nel database, è necessario sovrascrivere il metodo Seed. Diamo un'occhiata al seguente esempio in cui alcuni dei dati predefiniti vengono avviati nel database in una 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);
   }
}

Nel codice precedente, la tabella degli studenti viene inizializzata. È necessario impostare questa classe di inizializzazione DB nella classe di contesto come illustrato nel codice seguente.

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

Di seguito è riportata l'implementazione della classe completa della classe MyContext, che contiene anche la classe inizializzatore 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 l'esempio precedente viene compilato ed eseguito, è possibile visualizzare i dati in un database come mostrato nell'immagine seguente.

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.