Entity Framework - База данных семян
В 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);
}
}
}
Когда приведенный выше пример компилируется и выполняется, вы можете увидеть данные в базе данных, как показано на следующем изображении.
Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.