Entity Framework - Seed-Datenbank

In Entity Framework wurde Seed in EF 4.1 eingeführt und arbeitet mit Datenbankinitialisierern. Die allgemeine Idee einesSeed Methodbesteht darin, Daten in einer Datenbank zu initialisieren, die von Code First erstellt oder von Migrations entwickelt wird. Diese Daten sind häufig Testdaten, können aber auch Referenzdaten wie Listen bekannter Studenten, Kurse usw. sein. Wenn die Daten initialisiert werden, werden folgende Schritte ausgeführt:

  • Überprüft, ob die Zieldatenbank bereits vorhanden ist.
  • Wenn dies der Fall ist, wird das aktuelle Code First-Modell mit dem in Metadaten in der Datenbank gespeicherten Modell verglichen.
  • Die Datenbank wird gelöscht, wenn das aktuelle Modell nicht mit dem Modell in der Datenbank übereinstimmt.
  • Die Datenbank wird erstellt, wenn sie gelöscht wurde oder überhaupt nicht vorhanden war.
  • Wenn die Datenbank erstellt wurde, wird die Initializer-Seed-Methode aufgerufen.

Die Seed-Methode verwendet das Datenbankkontextobjekt als Eingabeparameter, und der Code in der Methode verwendet dieses Objekt, um der Datenbank neue Entitäten hinzuzufügen. Um Daten in Ihre Datenbank einzufügen, müssen Sie die Seed-Methode überschreiben. Schauen wir uns das folgende Beispiel an, in dem einige der Standarddaten in einer internen Klasse in die Datenbank initiiert werden.

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

Im obigen Code wird die Schülertabelle initialisiert. Sie müssen diese DB-Initialisierungsklasse in der Kontextklasse festlegen, wie im folgenden Code gezeigt.

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

Im Folgenden finden Sie die vollständige Klassenimplementierung der MyContext-Klasse, die auch die DB-Initialisierungsklasse enthält.

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

Wenn das obige Beispiel kompiliert und ausgeführt wird, können Sie die Daten in einer Datenbank sehen, wie in der folgenden Abbildung gezeigt.

Wir empfehlen, dass Sie das obige Beispiel zum besseren Verständnis Schritt für Schritt ausführen.