8 min read

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.

Entity Framework Core kullanılan bir MVC uygulamasında model ve context sınıfları üzerinden hazır controller ve view'lar oluşturabiliyoruz. Scaffolding adı verilen bu işlem zamandan tasarruf etmenizi sağlarken aynı zamanda hata yapma ihtimalinizi de azaltmış oluyor.

Bu yazıda kullanacağımız projenin tamamlanmış halini github'dan indirip çalıştırabilirsiniz.

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

Kurulum

İlk olarak kod oluşturma işlemlerini gerçekleştiren CLI araçlarını -eğer yoksa- yüklemeniz gerekiyor. Eğer varsa update komutuyla güncelleme olup olmadığına da bakabilirsiniz. Daha sonra bir Design paketi ekleyerek controller ve view kodlarının yazılmasını sağlayacağız. Adında visual studio olduğunda bakmayın, onunla bir alakası yok. Son olarak SqlServer paketi yüklememiz gerekiyor. Esasında buna ihtiyacımız yok ama scaffolding için gerektiğinden şimdilik ekliyoruz.

dotnet tool install --global dotnet-aspnet-codegenerator --version 3.1.4
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.4
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.11

Scaffold komutu ile controller ve view'ların oluşturulması

Terminalden controller ve view'ların scaffold edilmesi için gereken komutu yazıyoruz. Burada -name ile dilediğimiz controller adını , -m ile kullanılacak model sınıfı adını, -dv ile context sınıfı adını, -outDir ile controller dizini adını belirtiyoruz.

C:\Users\trinity\Desktop\PROJECTS\dbfirst>dotnet aspnet-codegenerator controller -name AuthorController -m Author -dc peopledbContext -outDir Controllers -f
Building project ...
Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory.
Attempting to figure out the EntityFramework metadata for the model and DbContext: 'Author'
Added Controller : '\Controllers\AuthorController.cs'.
Added View : \Views\Author\Create.cshtml
Added View : \Views\Author\Edit.cshtml
Added View : \Views\Author\Details.cshtml
Added View : \Views\Author\Delete.cshtml
Added View : \Views\Author\Index.cshtml
RunTime 00:00:13.21

C:\Users\trinity\Desktop\PROJECTS\dbfirst>

Bu işlem bittiğinde hem controller, hem de view'lar hazırlanmış oluyor.

Aynı işlemi diğer modeller için de tekrar ederek controller ve view'lar için büyük oranda hazır birer altyapı oluşturabilirsiniz.

C:\Users\trinity\Desktop\PROJECTS\dbfirst>dotnet aspnet-codegenerator controller -name BookController -m Book -dc peopledbContext -lers -f
Building project ...
Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory.
Attempting to figure out the EntityFramework metadata for the model and DbContext: 'Book'
Added Controller : '\Controllers\BookController.cs'.
Added View : \Views\Book\Create.cshtml
Added View : \Views\Book\Edit.cshtml
Added View : \Views\Book\Details.cshtml
Added View : \Views\Book\Delete.cshtml
Added View : \Views\Book\Index.cshtml
RunTime 00:00:13.69

Controller sınıfı incelemesi

Şimdi oluşan controller sınıflarını inceleyelim. İlk bakışta gözen çarpan bir detay, Dependency Injection ile context'in verilmesi oluyor. Bu tasarım deseni hazlihazırda uygulanmış.

Dependency injection ile veritabanı context'inin paslanması

HTTP GET ve POST istekleri ile kullanılmak üzere listeleme, detay sayfası, yeni oluşturma, güncelleme ve silme işlemleri tanımlanmış.  

useDefaultLayout ve referenceScriptLibraries flag'leri

Eğer Boostrap kütüphanesi kullanmak ve ortak şablon yani layout'tan yararlanarak view'larınızın görüntüsü iyileştirmek isterseniz komutu alttaki şekilde değiştirerek kullanabilirsiniz.

C:\Users\trinity\Desktop\PROJECTS\dbfirst>dotnet aspnet-codegenerator controller -name CustomerController -m Customer -dc peopledbContext 
-outDir Controllers --useDefaultLayout --referenceScriptLibraries -f
Building project ...
Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory.
Attempting to figure out the EntityFramework metadata for the model and DbContext: 'Customer'
Added Controller : '\Controllers\CustomerController.cs'.
Added View : \Views\Customer\Create.cshtml
Added View : \Views\Customer\Edit.cshtml
Added View : \Views\Customer\Details.cshtml
Added View : \Views\Customer\Delete.cshtml
Added View : \Views\Customer\Index.cshtml
RunTime 00:00:11.42

Yine hazır bir görüntü almak için Order modeli için de controller ve view oluşturalım.

C:\Users\trinity\Desktop\PROJECTS\dbfirst>dotnet aspnet-codegenerator controller -name OrderController -m Order -dc peopledbContext -outDir Controllers --useDefaultLayout --referenceScriptLibraries -f
Building project ...
Finding the generator 'controller'...
Running the generator 'controller'...
Attempting to compile the application in memory.
Attempting to figure out the EntityFramework metadata for the model and DbContext: 'Order'
Added Controller : '\Controllers\OrderController.cs'.
Added View : \Views\Order\Create.cshtml
Added View : \Views\Order\Edit.cshtml
Added View : \Views\Order\Details.cshtml
Added View : \Views\Order\Delete.cshtml
Added View : \Views\Order\Index.cshtml
RunTime 00:00:11.07

Projeyi çalıştırdığımızda oluşan view'ları görebiliriz.

dotnet run

CustomerController ile gösterilen Index sayfası bu şekilde daha göze hitap eden bir hal almış.

Yeni oluşturma sayfasına bakalım.

Foreign key ile bağlantılı kayıtların gösterilmesi

Order yani sipariş sayfalarına bakalım.

Burada scaffold edilirken, Customer tablosunda foreign key ile işaret edilen kaydın hangi alanını seçeceğini bilememiş. Bu yüzden sadece Id değeri konmuş. Esasında controller tarafında bağlantılı kayıtlar -Include() metodu kullanılarak- Customer nesneleri halinde getirilmiş durumda. Biz view tarafında Id yerine Lastname alanını seçerek gösterdiğimizde, ilgili kayıttaki soyadı bilgisini görebiliriz.

Bağlantılı kayıtların view tarafında otomatik olarak gösterilmesi

Book controller ile yeni kitaplar ekleyebiliriz. Burada foreign key kullanıldığından dolayı yazar kısmından bir yazarı seçebilmemiz sağlanmış.

Entity Framework burada bizim yerimize controller tarafında Include() ile bağlantılı yazarları getirmiş. Ayrıca view tarafında da bir SelectList içerisinde bu yazarların isimlerini göstermiş. Elbette bu büyük bir kolaylık bizim için.

Scaffold edilen view'ların düzenlenmesi

Hazır view'lara istediğimiz özellikleri ekleyebiliriz. Örneğin yazarlar ile bağlantılı olan kitapları birlikte görmek istediğimizi düşünelim. Yazarların listesinde her birinin kitaplarından birkaç örnek göstermek istersek, bunu controller tarafında Include() metodu ile kolayca yapabiliriz. View tarafında da Include ile getirilen verilerden bir seçme yapmamız yeterli olur.

Aynı yazara ait birden fazla kitap bulunuyor
Controller'da bağlantılı kayıtların getirilmesi
View'da bağlantılı kayıtların gösterilmesi
Yazar sayfasında kitaplarından örnekler de listeleniyor

Benzer şekilde Book controller sınıfına baktığımızda, kitapların yazarlarını da listede görmek isteyeceğimiz zaten düşünülmüş ve Include() ile sonuçlara yazar tablosundan yazar adları da getirilmiş.

Controller ile yeni kayıt oluşturma, güncelleme ve silme işlemleri

Scaffold edilen controller'larda tipik CRUD işlemlerinin nasıl yapıldığına baktığımızda, standart olarak yapılan, boilerplate dediğimiz devamlı tekrar edilen bir nevi altyapı kodlarının otomatik olarak yazıldığını görebiliyoruz. Tekrar tekrar kayıt kontrolü, validasyon, yönlendirme vb. işlemlerinin önceden hazırlanabilmesi geliştiricilere büyük bir kolaylık ve zaman tasarrufu sağlıyor.

Create: Yeni kayıt oluşturma

Yeni oluşturma işlemine bakalım. Kayıt formu post edildiğinde standart bir validasyonun ardından context üzerinden kayıt yapılıyor. ORM kullanmanın sağladığı kolaylığı net bir şekilde görebilirsiniz.

Update: Kayıt güncelleme

Güncelleme işlemine bakalım. Güncelleme formu post edildiğinde öncelikle güncellenecek kaydın varlığı kontrol ediliyor. Ardından standart bir validasyon yapılıyor. Girdilerde problem yoksa context üzerinden kayıt güncelleniyor.

Delete: Kayıt silme

Silme işlemine göz atalım. Öncekilerde olduğu gibi kayıt silme formu post edildiğinde de önce kaydın veritabanında bulunduğu kontrol edilip, ardından context üzerinden kayıt siliniyor.

Controller'da silme sayfası gösterilmesi
Silme sayfası
Controller'da silme işlemi
Silme başarılı olduğunda Index sayfası gösteriliyor

Son söz.

Bu yazıda Entity Framework Core ve MySql veritabanı kullanılan bir mvc uygulamasında, hazır model ve dbcontext sınıfları üzerinden scaffolding yardımıyla controller ve view'ların otomatik olarak oluşturulabildiğini gördük.

Elbette scaffolding ile oluşan controller ve view'lar için tamamlanmış diyemeyiz. Bu altyapıyı çeşitli eklemeler, çıkarmalar ve düzeltmelerle istediğimiz şekilde biçimlendirmek yine bize düşüyor.

Scaffolding yaparken hangi paketlerin hangi sürümleri ile çalıştığınıza çok dikat etmelisiniz. Aksi halde en ufak bir uyumsuzlukta scaffolding işlemi başarısız olacaktır. Versiyon numaralarını dikkatli yazarak kurulum yapmak gerçekten de büyük önem arz ediyor. Sıkıntı yaşamanız halinde github'dan projeyi indirip kendi projenizle karşılaştırabilirsiniz.

Devam yazılarında yine Entity Framework Core ve MySql kullanarak, hem EF Core gibi lightweight bir ORM'den hem de MySql gibi popüler bir veritabanından güç alan çeşitli örnekler yapacağız. İlerleyen yazılarda görüşmek üzere, hoşçakalın.