﻿ Asp.NET Core 3.0 – Çok Katmanlı Mimaride Migration İşlemleri – Yazılım Mimarileri ve Tasarım Desenleri Üzerine
Yazar: Gençay · 30 Ekim 2019
Bu içeriğimizde çok katmanlı mimari yapılanmasının kullanıldığı Asp.NET Core 3.0 uygulamalarında migration işlemlerinin nasıl gerçekleştirildiğini inceleyeceğiz.
Herşeyden önce ilk olarak örnek bir Asp.NET Core 3.0 uygulaması açıyoruz. Bu uygulama bizim sunum katmanımız(PL – Presentation Layer) olacaktır. Hemen ardında iş katmanımızı(BL – Busines Layer) ve veri erişim katmanımızı(DAL – Data Access Layer) oluşturalım.
Makalemizin başlığında ifade edildiği gibi migration odaklı bir içerik geliştireceğiz. Haliyle generate edilecek olan migrationlar dahil Entity Framework Core – Code First kurulumuna dair tüm çalışmalarımızı DAL katmanında gerçekleştireceğiz. Dolayısıyla aşağıdaki ekran görüntüsünde de olduğu gibi context nesnesi ile birlikte tüm entitylerin DAL katmanında dizany edilmesi gerekmektedir.
Bu hazırbulunuşluktan sonra artık yapılması gerekenleri adım adım ele alalım…
Asp.NET Core 3.0’da sıkıntısız çalışmak istiyorsanız eğer dotnet tool install –global dotnet-ef komutunu çalıştırırarak dotnet ef aracını en son sürümüyle güncelleştiriniz.
İlk olarak DAL katmanında geliştirilen context nesnesinin Asp.NET Core uygulamasına dahil edilmesi gerekmektedir. Bunun için öncelikle ilgili katmanı PL katmanına referans olarak eklememiz gerekiyor.
Ardından Startup.cs dosyasındaki ConfigureServices metodu içerisinde “AddDbContext” metodu ile aşağıdaki gibi uygulamaya dahil edilmesi gerekmektedir. Burada sağlıklı çalışabilmeniz için “Microsoft.EntityFrameworkCore.SqlServer” kütüphanesini uygulamaya eklemeniz gerekmektedir.
Yukarıdaki ekran görüntüsünde yeşil daire içerisine aldığımız kod uygulamanın appsettings.json dosyasındaki “ConnectionStrings” alanı içerisindeki “SQLProvider” isimli alanın değerini getirmektedir.
Mavi renkli daire içerisinde ise generate edilecek olan migrationların hangi katmana atılacağını belirlemekteyiz.
Bu işlemden sonra Package Manager Console üzerinden migration talebinde bulunabiliriz.
add-migration mig_1 komutunu verdiğimizde,
add-migration : The term ‘add-migration’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Bu hatayı çözebilmek için PL katmanına “Microsoft.EntityFrameworkCore.Tools” kütüphanesini yüklememiz gerekmektedir. “La hoca, bizim işimiz DAL katmanıyla değil mi? Ne diye PL’ye yüklüyoruz?” dediğinizi duyar gibiyim. Evet… PL’ye yüklememiz gerekmektedir çünkü ana uygulamamızdır. Her ne kadar package manager penceresinden isteklerde bulunsakta compiler öncelikle ana uygulamaya gitmekte ve ardından ilgili katmanın(DAL) .dll dosyası üzerinden gerekli çalışmayı sergilemektedir. Eee dolayısıyla buradaki tüm aktiviteyi ilgili Tools kütüphanesi üstlendiği için PL’ye yüklenmesi gerekmektedir.
Velhasıl ilgili kütüphaneyi yükledikten sonra tekrar Package Manager Console üzerinden migration talebinde bulunduğumuzda,
görüldüğü üzere başarıyla migrationlar oluşturulmaktadır.
Evet… Buna sevinebiliriz ama bir sorunumuz var. DAL katmanında generate edilen migrationlar aşağıdaki ekran görüntüsünde olduğu gibi hata vermektedirler 😕
Bu hatanın nedeni DAL katmanında migration yapılanmasında kullanılan kütüphanelerin dahil edilmemesidir. Bunun için yukarılarda kullandığımız “Microsoft.EntityFrameworkCore.SqlServer” kütüphanesini DAL katmanına entegre etmememiz yeterli olacaktır.
Netice olarak package manager console üzerinden generate edilen migrationlar update-database komutuyla veritabanına yansıtılacak ve tasarımımız başarılı bir şekilde işlemeye devam edecektir.
Aslında makalemizi burada sonlandırabiliriz lakin içerikte ele alınan tüm yapılanmayı bir Komut İstemi yahut Powershell penceresinde de gerçekleştirmek isteyenleriniz olacaktır. Nihayetinde herkes Visual Studio kullanmayabilir, dolayısıyla package manager console penceresi olmayabilir… 😉
Bizim kullanım sınırlarımız içerisinde powershell ile komut istemi birebir aynı özellikte yapılanmalar olduğunda dolayı bu makalemizde powershell üzerinden akışa devam edeceğiz. Biraz önce oluşturulan migrationları silip, mevcut durumda powershell üzerinden bir migration oluşturmaya çalışıyor olsaydık aşağıdaki gibi bir hatayla karşılaşacaktık.
Hatamızın metinsel hali;
Your startup project ‘DAL’ doesn’t reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.
Bu hatayı düzeltebilmek için hata mesajında da belirtildiği gibi “Microsoft.EntityFrameworkCore.Design” kütüphanesini DAL katmanına yüklememiz gerekmektedir.
Ardından tekrar powershell üzerinden migration basmaya çalıştığımızda da aşağıdaki hatayla karşılaşılacaktır.
Unable to create an object of type ‘NTierContext’. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
Bu hata, context nesnesini oluşturacak tasarımın olmamasından kaynaklanmaktadır ve biz zamanında bu hata üzerine şuradaki makalemizde odaklanmış ve çözüm üretmiş bulunmaktayız. Çözüm olarak ilgili makalede daha da detaylı irdelenmesine istinaden kısaca DAL katmanında IDesignTimeDbContextFactory<T> tipinden türeyen bir sınıfın oluşturulması gerektiğini ve içeriğininde aşağıdaki gibi geliştirildiğini söyleyebiliriz.
Yukarıdaki ekran görüntüsüne göz atarsanız eğer kırmızı ile vurgulanan alanda connection string değerini elde edebilmek maksadıyla PL katmanındaki appsettings.json dosyasına erişebilmek için uğraşmaktayız. Burada kullanılan SetBasePath ve AddJsonFile metotlarına erişebilmek için “Microsoft.Extensions.Configuration.Json” kütüphanesini DAL katmanına yüklemeniz gerekmektedir.
Tüm bu işlemlerin neticesinde powershell üzerinden migrationları generate edebilmekte ve tüm yapılanmayı sql sunucusuna fiziksel olarak yansıtabilmekteyiz(update).
Böylece Asp.NET Core 3.0 çok katmanlı mimari çekirdeğinde geliştirilen bir uygulamada migration yapılanmasının nasıl ve nelere dikkat edilerek yapılması gerektiği konusunda uzun ve detaylıca irdelemede bulunmuş oluyoruz. Son olarak hangi katmanda hangi kütüphanenin olması gerektiğine dair özet bilgiyi verdikten sonra makalemizi noktayabiliriz.
Etiketler: AddJsonFileAsp.NET Core Çok Katmanlı MimariAsp.NET Core N Tier ArchitectureBLBusines LayerÇok Katmanlı MimariDAL - Data Access LayerMicrosoft.EntityFrameworkCore.DesignMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.ToolsMicrosoft.Extensions.Configuration.JsonN-Tier ArchitecturePLPresentation LayerSetBasePath
Sonraki yazı Asp.NET Core 3.0 Web API Mimarisinde “A Possible Object Cycle Was Detected Which Is Not Supported” Hatası ve Çözümü
Önceki yazı C# 8.0 – Asenkron Foreach