Entity Framework - Tohum Veritabanı
Entity Framework'te Seed, EF 4.1'de tanıtılmıştır ve veritabanı başlatıcılarla çalışır. Genel fikirSeed MethodVerileri, Code First tarafından oluşturulan veya Geçişler tarafından geliştirilen bir veritabanında başlatmaktır. Bu veriler genellikle test verileridir, ancak aynı zamanda bilinen Öğrenciler, Kurslar, vb. Listeleri gibi referans verileri de olabilir. Veriler başlatıldığında, aşağıdakileri yapar -
- Hedef veritabanının zaten var olup olmadığını kontrol eder.
- Varsa, geçerli Code First modeli, veritabanındaki meta verilerde depolanan modelle karşılaştırılır.
- Geçerli model, veritabanındaki modelle eşleşmezse veritabanı bırakılır.
- Veritabanı düşürüldüyse veya ilk etapta mevcut değilse oluşturulur.
- Veritabanı oluşturulmuşsa, başlatıcı Seed yöntemi çağrılır.
Seed yöntemi, veritabanı bağlam nesnesini bir giriş parametresi olarak alır ve yöntemdeki kod, veritabanına yeni varlıklar eklemek için bu nesneyi kullanır. Veritabanınıza veri yerleştirmek için Tohum yöntemini geçersiz kılmanız gerekir. Varsayılan verilerin bir kısmının dahili bir sınıfta veritabanına başlatıldığı aşağıdaki örneğe bir göz atalım.
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);
}
}
Yukarıdaki kodda öğrenci tablosu başlatılmıştır. Bu DB başlatıcı sınıfını aşağıdaki kodda gösterildiği gibi bağlam sınıfında ayarlamanız gerekir.
public MyContext() : base("name=MyContextDB") {
Database.SetInitializer<MyContext>(new UniDBInitializer<MyContext>());
}
Aşağıda, DB başlatıcı sınıfını da içeren MyContext sınıfının tam sınıf uygulaması yer almaktadır.
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);
}
}
}
Yukarıdaki örnek derlendiğinde ve yürütüldüğünde, aşağıdaki görüntüde gösterildiği gibi verileri bir veritabanında görebilirsiniz.
Daha iyi anlamak için yukarıdaki örneği adım adım uygulamanızı öneririz.