Entity Framework - baza danych nasion

W Entity Framework Seed został wprowadzony w EF 4,1 i działa z inicjatorami bazy danych. Ogólna ideaSeed Methodpolega na zainicjowaniu danych w bazie danych, która jest tworzona przez Code First lub ewoluowana przez migracje. Te dane są często danymi testowymi, ale mogą być również danymi referencyjnymi, takimi jak listy znanych Studentów, Kursy itp. Po zainicjowaniu danych wykonuje się następujące czynności -

  • Sprawdza, czy docelowa baza danych już istnieje.
  • Jeśli tak, bieżący model Code First jest porównywany z modelem przechowywanym w metadanych w bazie danych.
  • Baza danych jest usuwana, jeśli bieżący model nie pasuje do modelu w bazie danych.
  • Baza danych jest tworzona, jeśli została usunięta lub nie istniała w pierwszej kolejności.
  • Jeśli baza danych została utworzona, wywoływana jest metoda Seed inicjatora.

Metoda Seed przyjmuje obiekt kontekstu bazy danych jako parametr wejściowy, a kod w metodzie używa tego obiektu do dodawania nowych jednostek do bazy danych. Aby przesłać dane do bazy danych, musisz zastąpić metodę Seed. Przyjrzyjmy się poniższemu przykładowi, w którym niektóre domyślne dane są inicjowane w bazie danych w klasie wewnętrznej.

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

W powyższym kodzie inicjalizowana jest tabela uczniów. Musisz ustawić tę klasę inicjatora DB w klasie kontekstu, jak pokazano w poniższym kodzie.

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

Poniżej znajduje się pełna implementacja klasy MyContext, która zawiera również klasę inicjalizatora 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);
      }
   } 
}

Gdy powyższy przykład zostanie skompilowany i wykonany, możesz zobaczyć dane w bazie danych, jak pokazano na poniższej ilustracji.

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.