Asp.Net Core Projelerinde EF Core Veritabanı Oluştururken Seed Data Ekleme ve Konfigürasyon İşlemleri
Yeniden Merhaba, sizlerin de bildiğiniz üzere benim gibi öğrenmeye çabalı arkadaşlarımın bu öğrenme süreçlerini belki kolaylaştırmak ve onları benim de ilgili olduğum konularda fikir sahibi etmek gayesiyle üzerine gittiğim ve öğrendiğim konuları en hızlı şekilde büyük küçük demeden öğrendiğim kadarıyla ben de birer Medium yazısına dökerek elimden geldiğince paylaşmaya çalışıyorum. Bugün de Asp.Net Core Projelerinde, code-first yaklaşımı ile Entity Framework Core veritabanı oluştururken, oluşturacağımız veritabanı tablolarıyla ilgili data konfigurasyonlarını ve veritabanı oluşurken içinde default-data ile oluşması amacıyla yapılan Seed işlemlerini öğrendiğim kadar, en iyi ve sade şekilde anlatmaya çalışacağım. Keyifli Okumalar.

- Yapacağım örnek projede önce Core Katmanında Student ve Teacher adında iki adet entity oluşturacağım. Daha sonra Data katmanında ilgili Seed ve Konfigurasyon işlemlerini gerçekleştireceğim ardından da Context sınıfımı oluşturup, yaptığım Seed ve Konfigurasyon işlemlerimi bu Context sınıfı içerisinde tanımlayıp veritabanımı oluşturacağım.
- Öncelikle Core katmanımda Entities klasörü altında entity sınıflarımı oluşturuyorum.
Öğretmen ve Öğrenci arasında kuracağım ilişkide bir öğretmenin birden fazla öğrencisi olabileceğini fakat bir öğrencinin tek bir öğretmeni olacağını varsayarak yapıyorum.
- Entity sınıflarımı yukarıdaki gibi oluşturdum. Ardından projemin Data katmanımda ilgili Context sınıfımı oluşturmadan önce yapmak istediğimiz Konfigurasyon ve Seed işlemlerini gerçekleştirmek amacıyla Configurations ve Seeds adında iki ayrı klasör oluşturuyoruz.
- Daha sonra Configurations isimli klasörüm altında konfigurasyon işlemlerimi yapacağım StudentConfiguration ve TeacherConfiguration isimli iki sınıf oluşturuyorum.
- StudentConfiguration sınıfı içerisinde Student nesnem için veritabanı konfigurasyonlarını yapmaya başlıyorum.
Konfigurasyon işlemini gerçekleştirmek için yukarıdaki gistte gördüğünüz üzere IEntityTypeConfiguration Interface’ini sınıfınıza implemente etmeniz gerekiyor.Bu da generic bir Interface olduğu için sizden class türünde bir parametre istiyor. Bu istediği generic tipe de üzerinde konfigurasyon işlemi yapmak istediğiniz Student sınıfınızı veriyorsunuz. Son olarak da Interface’nin getirdiği metodu sınıfa implemente ederek yukarıda da gördüğünüz gibi metodun içinde builder nesnesi üzerinden konfigurasyon işlemlerinizi yapıyorsunuz.
- Yukarıda da gördüğünüz gibi ID property’sinin veritabanında bir key değer olduğunu ve kolonunun Identity kolonu olacağını, Name property’sinin girilmesi zorunlu bir değer olduğunu ve bir maxLength’i olacağını tanımladım.
- Tabi ki bu benim yaptığım konfigurasyon metotlarının daha başka birçok seçeneği var. Yani veritabanı kolonlarınız ve datalarınız ile ilgili bunlardan farklı bir sürü (kolon ismi atama vs. gibi)konfigurasyon seçeneğiniz bulunuyor.
Aynı işlemi şimdi de Teacher sınıfının konfigurasyon işlemlerini yapmak için oluşturduğum TeacherConfiguration sınıfım içinde yapacağım.
İstediğim konfigurasyon işlemlerimi yaptım. Artık veritabanına default data eklemek amacıyla oluşturduğum Seeds klasörü altına StudentSeed ve TeacherSeed isimli iki sınıf oluşturuyorum.
- StudentSeed sınıfı aracılığıyla Student sınıfımla ilgili veritabanı tabloma default data ekleme işlemlerimi yapmaya başlıyorum.
- StudentSeed sınıfıma da aynı Configuration sınıflarımda yaptığım gibi IEntityTypeConfiguration Interface’mi implemente ediyorum ve istediği generic parametre kısmına da Student tipinden default data eklemek istediğim için Student sınıfını veriyorum.
- Sonrasında yine ilgili Interface’nin Configure isimli metodunu implemente edip builder nesnesinin HasData metodu üzeriden veritabanında Students tablosu oluşurken beraberinde oluşmasını istediğim Student tipinden datalarımı vermeye başlıyorum.
- Student tipinden yukarıda da görüldüğü gibi tek bir data ekliyorum.
NOT: Bir tabloya seed data ekleme işleminin hatasız sonuçlanması için mutlaka ID değerinin de eklenmesi,boş geçilmemesi gereklidir!
- Ardından aynı işlemi TeacherSeed sınıfı içinde de yapıyorum ve veritabanı oluşurken beraberinde oluşmasını istediğim iki adet Teacher sınıfı türünden seed-data’larımı ekliyorum.
NOT: Bu seed-data ekleme işlemini gerçekleştirirken yaptığımız gibi elle girmek yerine, ihtiyaca yönelik olarak ,bir önceki yazımda bahsettiğim Bogus kütüphanesi yardımıyla Entity’lerimize uygun fake-datalar oluşturarak ve bu dataların da seed-data olarak veritabanında oluşmasını sağlayabiliriz. Bogus Kütüphanesi ile ilgili yazıma buradan ulaşabilirsiniz.
- Artık Seed işlemlerimi de tamamladığıma göre veritabanını oluşturmak için gerekli olan AppDbContext ismi ile context sınıfımı oluşturabilirim.
Entity Framework Core işlemleri için ilgili indirilmesi gereken NuGet paketlerinin indirilmesi, context sınıfının oluşturulması vs. gibi işlemleri daha önceki ASP.Net Core Projelerinde Code-First Yaklaşımı ile Entity Framework Core Veri Tabanı Oluşturulması isimli yazımda detaylı açıkladığım için detaylandırmıyorum. İlgili yazıma buradan ulaşabilirsiniz.
İlgili OnConfiguring metodum içinde connectionString ve MigrationAssembly işlemlerim ve ardından DbSetlerimi oluşturduktan sonra yaptığımız işlemleri veritabanı oluşma processine dahil etmek için EntityFramework aracılığıyla gelen OnModelCreating metodunu override ederek yukarıda da gördüğünüz gibi metottan gelen modelBuilder nesnesinin ApplyConfiguration metodu içerisinde Konfigurasyon ve Seed data ekleme işlemlerini yaptığımız sınıflarımızın birer örneğini yukarıdaki gibi oluşturarak tanımlıyoruz.
NOT: Bu yaptığımız Configuration ve Seed işlemleri ayrı klasörler açılmadan, bu OnModelCreating sınıfı içerisinde modelBuilder.Entity üzerinden de yapılabiliyor. Fakat best practice açısından ve Context sınıfını sade tutmak açısından bu işlemlerin ayrı klasörlerde yapılması tercih ediliyor.
- İlgili işlemleri tamamladık. Şimdi artık migration işlemimizi gerçekleştirip verdiğimiz seed-datalar ve yaptığımız konfigurasyonlarla birlikte veritabanımızı oluşturabiliriz.
- Package Manager Console’da add-migration InitialCreate şeklinde migration’umu yaratıyorum.
- Oluşan InitialCreate isimli migration sınıfının içine de bakıldığında yaptığımız konfigurasyonların ve eklediğimiz seed dataların veritabanı oluşma işlemine dahil edildiğini yukarıdaki gibi göreceksinizdir.
- Son olarak Package Manager Console’a update-database diyerek veritabanımızı oluşturuyoruz. Şimdi de MsSql Server’imizi açıp oluşan veritabanında default dataların oluşup oluşmadığına kontrol edelim.

- Yukarıda gördüğünüz gibi eklediğimiz seed-datalar default bir şekilde ilgili veritabanı tablolarında başarılı bir şekilde oluştu. Artık bu datalar üzerine işlemler yaparak tablolarımızı doldurmaya devam edebiliriz.
Bu şekilde bu yazımın da sonuna geldim. Yazımın başında da dediğim gibi, kendi öğrendiğim şeyleri ben de en hızlı şekilde, benim gibi öğrenmeye hevesli arkadaşlarıma kendi öğrendiğim kadarıyla, doğruluğuna dikkat ederek paylaşmaya çalışıyorum. Umarım okuyan kişiler için faydalı ve ilham verici bir yazı olur. Bir başka yazımda buluşmak üzere. Hoşçalakın.