Khung thực thể - Cơ sở dữ liệu hạt giống
Trong Entity Framework, Seed đã được giới thiệu trong EF 4.1 và hoạt động với bộ khởi tạo cơ sở dữ liệu. Ý tưởng chung của mộtSeed Methodlà khởi tạo dữ liệu vào một cơ sở dữ liệu đang được tạo bởi Code First hoặc được phát triển bởi Migrations. Dữ liệu này thường là dữ liệu kiểm tra, nhưng cũng có thể là dữ liệu tham chiếu, chẳng hạn như danh sách Sinh viên, Khóa học đã biết, v.v. Khi dữ liệu được khởi tạo, nó thực hiện như sau:
- Kiểm tra xem cơ sở dữ liệu đích đã tồn tại hay chưa.
- Nếu đúng, thì mô hình Code First hiện tại được so sánh với mô hình được lưu trữ trong siêu dữ liệu trong cơ sở dữ liệu.
- Cơ sở dữ liệu bị loại bỏ nếu mô hình hiện tại không khớp với mô hình trong cơ sở dữ liệu.
- Cơ sở dữ liệu được tạo nếu nó bị loại bỏ hoặc không tồn tại ngay từ đầu.
- Nếu cơ sở dữ liệu đã được tạo, thì phương thức Seed khởi tạo sẽ được gọi.
Phương thức Seed lấy đối tượng ngữ cảnh cơ sở dữ liệu làm tham số đầu vào và mã trong phương thức sử dụng đối tượng đó để thêm các thực thể mới vào cơ sở dữ liệu. Để gieo dữ liệu vào cơ sở dữ liệu của bạn, bạn cần ghi đè phương thức Seed. Hãy xem ví dụ sau, trong đó một số dữ liệu mặc định được khởi tạo vào cơ sở dữ liệu trong một lớp nội bộ.
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);
}
}
Trong đoạn mã trên, bảng sinh viên được khởi tạo. Bạn cần đặt lớp trình khởi tạo DB này trong lớp ngữ cảnh như được hiển thị trong đoạn mã sau.
public MyContext() : base("name=MyContextDB") {
Database.SetInitializer<MyContext>(new UniDBInitializer<MyContext>());
}
Sau đây là việc triển khai lớp hoàn chỉnh của lớp MyContext, lớp này cũng chứa lớp bộ khởi tạo 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);
}
}
}
Khi ví dụ trên được biên dịch và thực thi, bạn có thể thấy dữ liệu trong cơ sở dữ liệu như thể hiện trong hình sau.
Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.