Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core 3.0 – Çok Katmanlı Mimaride Migration İşlemleri

Merhaba,

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.
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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.
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri
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.
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "SQLProvider": "Server=.;Database=NTierDB;Trusted_Connection=True;"
  }
}

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.

Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

Oda ne!
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.

hatasını almaktayız!

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,
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri
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 😕
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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.

Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri
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.

şeklindedir.

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.
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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.
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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).
Asp.NET Core 3.0 - Çok Katmanlı Mimaride Migration İşlemleri

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.

DAL PL
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

10 Cevaplar

  1. Samet dedi ki:

    Hocam öncelikle vermiş olduğunuz bilgiler çok değerli ve yeni öğrenme aşamasında olan biri olarak çok sık ziyaret ediyorum. Sorum şu olacak: DAL katmanında bulunan repository’lerimi BL katmanında kullanıyorum. Dependency injection kullanıyorum ve bu sebeple startup içersinde AddTransient yapmam gerekiyor. Fakat bunu yaparsam PL katmanı DAL katmanını referans almış olacak. PL katmanına DAL katmanını referans vermeden bu işi nasıl çözebilirim?
    Teşekkürler.

  2. ismet tuncer dedi ki:

    Hocam Selamlar,
    Öncelikle böyle yararlı bir içerik paylaştığınız için teşekkürler. Ben işlemleri adım adım yaparken bir hata alıyorum. services.AddDbContext(x => x.UseSqlServer(“”));
    kısmını eklerken aşağıdaki hatayı veriyor. İnternetten araştırıp bir kaç bişey yaptım ancak bu seferde add migration kısmında hata veriyor.
    Severity Code Description Project File Line Suppression State
    Error CS1061 ‘DbContextOptionsBuilder’ does not contain a definition for ‘UseSqlServer’ and no accessible extension method ‘UseSqlServer’ accepting a first argument of type ‘DbContextOptionsBuilder’ could be found (are you missing a using directive or an assembly reference?) NTierArchitectureNew D:\Users\ituncer\source\repos\NTierArchitectureNew\NTierArchitectureNew\Startup.cs 27 Active

  3. Mehmed Emre dedi ki:

    Selamün aleyküm. Benim entity’lerim Entities katmanında ve context sınıfımda DAL katmanında. Bu yüzden aşağıdaki işlemleri yaparken hata yapıyorum:

    Add-Migration deneme

    Update-Database

    Hata:

    Your startup project ‘FirstEntitiyFrameworkCore’ 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.

    Sorun context sınıfını Entitiy katmanına aldığımda çözülüyor. Fakat kurumsal mimarilerde context sınıfı entity katmanında değil? Bu sorun hakkında bir bilginiz var mı?

  4. mücteba dedi ki:

    hocam yazı harika. yalnız birkaç sorum olacak.
    ben “unable to create an object of…” hatasını PM de de alıyorum. Sebebi ne olabilir?
    birde madem biz appsettings.json daki connectionstring i factory classında tarif ettik. ozaman startup da neden AddDbContext le configure ediyoruz? Yani Startup daki configurasyon ayarı olmadan da context imizi oluşturabiliyoruz? Saygılar..

  1. 16 Aralık 2019

    […] içeriklerimizden Asp.NET Core 3.0 – Çok Katmanlı Mimaride Migration İşlemleri başlıklı makalemizde çok katmanlı mimari yapılanmasının migration işlemleriyle birlikte […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir