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.