В Entity Framework Seed был представлен в EF 4.1 и работает с инициализаторами базы данных. Общая идея Seed Method заключается в инициализации данных в базе данных, которая создается Code First или развивается посредством Migrations. Эти данные часто являются тестовыми данными, но также могут быть справочными данными, такими как списки известных студентов, курсы и т. Д. Когда данные инициализируются, они выполняют следующее:
- Проверяет, существует ли целевая база данных.
- Если это так, то текущая модель Code First сравнивается с моделью, хранящейся в метаданных в базе данных.
- База данных удаляется, если текущая модель не соответствует модели в базе данных.
- База данных создается, если она была отброшена или вообще не существовала.
- Если база данных была создана, то вызывается метод Seed инициализатора.
Метод Seed принимает объект контекста базы данных в качестве входного параметра, а код в методе использует этот объект для добавления новых объектов в базу данных. Чтобы заполнить данные в вашей базе данных, вам нужно переопределить метод Seed. Давайте рассмотрим следующий пример, в котором некоторые данные по умолчанию инициируются в базе данных во внутреннем классе.
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); } }
В приведенном выше коде таблица ученика инициализируется. Вам необходимо установить этот класс инициализатора БД в классе контекста, как показано в следующем коде.
public MyContext() : base("name=MyContextDB") { Database.SetInitializer<MyContext>(new UniDBInitializer<MyContext>()); }
Ниже приведена полная реализация класса MyContext, который также содержит класс инициализатора БД.
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); } } }
Когда приведенный выше пример скомпилирован и выполнен, вы можете увидеть данные в базе данных, как показано на следующем рисунке.
Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.