4 min read

Code-first scaffolding: Model sınıflarından context ve veritabanı oluşturma

EF Core ile sadece model sınıflarını ve bunların bağlantılarını tanımlayarak veritabanı tablolarını otomatik olarak oluşturabiliyoruz.
Code-first scaffolding: Model sınıflarından context ve veritabanı oluşturma

EF Core ile Code-first yaklaşımla hiç el değmeden veritabanı schema ve tablolarının oluşturulmasını sağlayabiliyoruz. Yapmamız gereken model sınıflarını ve bunlar arasındaki ilişkileri doğru ve net bir şekilde tanımlamak.

Eğer deneme projesi vb. yapıyorsanız şimdilik migration kulanmayabilirsiniz. Ama önerilen yaklaşım mutlaka migration kullanarak bütün veritabanı değişikliklerinin sistemli bir şekilde yapılmasıdır.

Projenin tamamlanmış halini github'dan inceleyebilirsiniz.

gulangurman/codefirst
Contribute to gulangurman/codefirst development by creating an account on GitHub.

Modellerin yazılması

Uygulamamızda çeşitli yazar, kitap, müşteri ve sipariş nesnelerine ihtiyaç olduğunu düşünelim. Bu bir kitap satış uygulaması olsun. Bu amaçla uygulamanın veritabanı tablolarını temsil edecek model sınıflarını sırayla yazalım.

DbContext yazılması

İlk olarak veritabanı tabloları ve bunların bağlantılarını temsilen bir DbContext türevi yazmamız gerekiyor. Önce DbSet'lerle modellerimizi listeleyerek başlayalım.

OnModelCreating() içerisinde tablo özelliklerini tanımlayalım. Bir yazara ait bir çok kitap olacağını, fakat bir kitabın tek bir yazarı olabileceğini farzedelim. Bu durumda bu bir 1-to-many ilişkisi olacaktır.

Aynı şekilde müşteri ve siparişte de bu tarz bir bağlantı kurulması gerekiyor.

Opsiyonel: Seeding

Seeding konusunda detaylı bir yazıya buradan göz atabilirsiniz.

Entity Framework Core ile Seeding
Bu yazıda Entity Framework Core ile bir veritabanı ilk oluşturulduğunda veri ekleme yani seeding işlemini uygulayacağız.

Bu aşamada eğer veritabanına ilk başta bazı verilerin eklenmesini istiyorsanız bir extension metodu aracılığıyla seeding yapabilirsiniz.

Örnek bir extension metodunu görelim.

Context'in Dependency Injection ile servislere eklenmesi

Yazılan context'i kullanabilmek için servislere eklememiz gerekiyor. Kendi bağlantı cümlenizi aşağıdaki gibi yazabilirsiniz.

Opsiyonel: Controller ve View'ların scaffold edilmesi

Eğer isterseniz bu aşamada controller ve view'ları scaffold ederek otomatik olarak oluşturabilirsiniz. Bu işlemi önceki bir makalede uygulamıştık. Aşağıdaki linkten bakabilirsiniz.

Scaffolding: Controller ve view’ları otomatik oluşturma
EF Core ile bir MVC projesinde DbContext ve model sınıfları üzerinden otomatik olarak controller ve view oluşturabiliyoruz.

A.Migration kullanmadan veritabanı oluşturma

İlk kez veritabanında schema ve tabloları oluşturmak için EnsureCreated() metodunu kullanabiliyoruz. Eğer zaten veritabanında bir schema oluşturduysanız fakat içerisinde hiç bir tablo yoksa, bu metot sadece tabloları oluşturur.

Burada uygulama ilk açıldığında HomeController.Index metodu çağrıldığından, EnsureCreated() ile veritabanı oluşturma emrini burada verdik. Fakat siz dilerseniz farklı bir noktada da bu metodu çağırabilirsiniz.

B.Migration ile veritabanı oluşturma

Migration yapılıp yapılmadığını kontrol ederek başlayalım. Şimdilik herhangi bir migration bulunamadı cevabını alacağız.

İlk migration'ı ekleyerek veritabanını güncelleyelim. Veritabanı ve içerisindeki tabloların otomatik olarak oluştuğunu görebilirsiniz. Eğer schema'nız var fakat hiç tablonuz yoksa, o zaman sadece tablolarınız oluşur.

dotnet ef migrations add InitialCreate
dotnet ef database update

Mysql workspace arayüzünden de tabloları görebiliriz. Anahtarlarına kadar her şey doğru yapılmış.

Bundan sonra veritabanında değişiklik yapılmasını gerektiren bir işlem yazdığımızda yeni bir migration ekleyip veritabanını güncellememiz gerekir.

dotnet ef migrations add <name>
dotnet ef database update