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.