.Net Core Eğitimleri

10- ) Web Api Projesi 1. Kısım

Business Katmanı

Projenin şuana kadar mimarisini oluşturduk, artık web api mizi yani iş katmanımızı kodlayabiliriz. İş katmanı bizim uygulamamızın ne iş yapacağını ve ne senaryolar ile çalışacağını yani işin kendisini kodladığımız yerdir. Bu katman logic ve business katmanı olarak da anılabilir.

Dependency Injection mantığını kullanabilmek adına controllerlarımızın hepsinin ne tür metotlar içereceğini yani metot imzalarını kodlayacağımız interfaceler oluşturacağız. Bunun için web api projesine solution explorer üzerinden sağ tıklayalım ve Interfaces isminde bir klasör oluşturalım. Oluşturduğumuz klasörün üzerine sağ tıklayarak Add –> NewItem diyelim dosya tipimizi Interface işaretleyelim ve Name alanına ILanguageController yazarak kaydedelim.

Controllerların Oluşturulması

Daha sonra ILanguageController.cs dosyasına çift tıklayalım ve içeriğini aşağıdaki şekilde düzenleyelim. Aşağıdaki kodu dikkatli inceleyecek olursanız IApiController Interface inden kalıtım alıyor bu nedenle ortak tüm metot imzaları zaten buraya geleceği için ekstra olarak aynı kodları tekrar yazmamıza gerek yok. Aklınıza neden o zaman bu interface’i oluşturduk sorusu gelebilir, birinci nedeni bu controller içinde farklı ve kendisine özgü metotlar yazabiliriz, ikinci neden ise dependency injection yaparken bu interface üzerinden instance alacağız.

Daha sonra Web api projemiz içerisinde bulunan Controllers sınıfına sağ tıklıyoruz ve Add –> Class diyerek Name kısmına LanguageController yazarak kaydediyoruz. Bu sınıf yukarıda oluşturduğumuz ILanguageController arayüzünden kalıtım alacak. LanguageController.cs dosyamıza çift tıklıyoruz ve içeriğini aşağıdaki şekilde düzenliyoruz.

Yukarıdaki controller içerisinde sadece CheckDublicateLanguage isminde bir metot var geri kalanlar ApiBase üzerinde kodlanmış durumda, api base generic bir sınıf olduğu için içerisine Language entitymizi, LanguageDto sınıfımızı ve Controller’ın kendisini gönderiyoruz. Eğer bu controller diğerlerinden bağımsız bir işlem yapacak ise ya da var olan ortak metotlardan (baseden gelen Add,Update,Delete,Find .. vs gibi) birini override edecek ise sınıfın içerisinde bu kodlamayı yapmamız gerekir. Farklı metotları tabiki bu kısma yazmadan önce interface içerisinde kodlamamız önemli.

LanguageController ile işlemleri bitirdiğimizde ApplicationUserController’ı oluşturacağız. Bu sınıf bizim, Identity yapısını kullanarak kullanıcı işlemleri yapmamızı sağlayacak. Kullanıcı ekleme,silme,güncelleme .. gibi ortak özelliklerin yanında bir sonraki derste göreceğimiz şifre değiştirme, mail adresi üzerinden kullanıcı bulma gibi ekstra metotları da içerecek. Öncelikle interfaceimizi oluşturacağız, bunun için web api projemize içinde bulunan Interfaces klasörüne solution explorer üzerinden sağ tıklıyoruz ve Add –> New Item diyerek, dosya tipi olarak Interface’i seçip Name alanına IUserController yazarak kaydediyoruz.

IUserController.cs dosyasına çift tıklayalım ve aşağıdaki şekilde içeriğini güncelleyelim.

Şimdi sıra UserController’ın kendisini oluşturmaya geldi bu sınıf az önce oluşturduğumuz IUserController arayüzünden kalıtım alacak. Solution explorer üzerinden wep api projemiz altında bulunan Controller klasörüne sağ tıklayalım ve Add –> Class diyerek Name alanına UserController yazıp kaydedelim. Daha sonra UserController.cs dosyasına çift tıklayarak içeriğiniz aşağıdaki şekilde düzenliyoruz.

Son olarak web api projemiz içinde bulunan startup.cs dosyasında çeşitli tanımlamalar yapacağız. Solution explorer üzerinde web api projemiz altında bulunan startup.cs dosyasını bulalım ve çift tıklayarak içini aşağıdaki şekilde güncelleyelim.

Projeyi Ateşliyoruz

Tüm işlemleri tamamladığımızda artık projeyi çalıştırıp test edebiliriz.

Klavyeden F5 tuşuna ya da debug menüsünden start debugging seçeneğine basalım. Uygulamamız çalıştığında tarayıcıda otomatik olarak açılacak ancak karşınıza tarayıcı ekranında 404 not found ibaresi gelecektir. İleriki derslerde projeye swagger kuracağız ve ilk açılışta swagger’ın gelmesini sağlayacağız. Şimdilik ilk testimizi yapmak için tarayıcıda adres satırında uygulamamızın adresinden sonra /Languages/GetAll yazalım ve entera basalım. (benim bilgisayarımda http://localhost:61025/language/getall bu link ile çalışıyor ancak sizde port farklı olabilir.) Eğer tüm işlemler doğru ise karşınıza aşağıdaki gibi bir ekran gelmeli.

Postman ile Testler

Şimdi bir de post örneği yapalım. Bunun için ben postman isimli uygulamayı kullanacağım ve anlatımı onun üzerinden yapacağım. Siz farklı bir uygulama ya da chrome üzerinden bir plug-in seçebilirsiniz, ekranlar aşağı yukarı aynı olacaktır. Postman’ı açtıktan sonra aşağıdaki ekran görüntüsünü takip edelim ve yeni bir dil eklemeyi deneyelim. Business katmanımızda yazdığımız dublicate kontrol sayesinde aynı culture değerine sahip iki farklı kayıt eklememiz engellenmiş olmalı. Deneyip sonucu görelim.

Yukarıdaki adımları tamamladığımız da ilk denememizde sonuç kısmında aşağıdaki şekilde bir görüntü görmeliyiz.

Body kısmında gönderdiğimiz Json içeriği değiştirmeden tekrar Send butonuna basarsak bu sefer aşağıdaki ekranın bizi karşılaması gerekiyor.

Aynı şekilde Yeni bir user eklemek için gereken bilgileri alt kısma yazıyorum. Postman ya da diğer rest tester uygulamaları üzerinden aşağıdaki adımları takip ederek kullanıcı eklemeyi deneyebilirsiniz. Bu işlemlerden sonra mutlaka veritabanınızı kontrol edin ve kayıtların oluşup oluşmadığınız gözlemleyin.

Kullanıcı eklemek için yapılması gerekenler;

1-) Url kısmına –>  http://localhost:61025//User/AddAsync  yazıyoruz ancak dikkat edin sizin uygulamanız farklı bir portta çalışıyor olabilir benim portum 61025.

2-) Body kısmına aşağıdaki JSON’ı yapıştırın ve içeriğini istediğiniz gibi düzenleyin. Language Id kısmına önceden eklediğiniz bir dilin Id sini yazın.

{
“emailConfirmed”: true,
“email”: “test@test.com”,
“userName”: “testuser”,
“password”: “Abc.123”,
“phoneNumber”: “112233445”,
“title”: “Manager”,
“phoneNumberConfirmed” : true,
“languageId” : “fe15e038-a5d4-450a-8c0c-b83d2f502f48”
}

Bir sonraki derste Identity alt yapısını kullanarak kullanıcı işlemlerini(sil,güncelle .. vs) tamamlayacak  ve rol işlemlerini göreceğiz.

Projenin buraya kadar olan kısmı ile ilgili sorun yaşıyorsanız bu link ile github üzerinden projeyi indirebilir ve kendi yazdığınız kodlar ile karşılaştırabilirsiniz. Sorularınız için yorum kısmını kullanabilir ya da mail adresim üzerinde benimle iletişime geçebilirsiniz.
Mail Adresim : mehmetalierol@windowslive.com

<- Önceki Post – Sonraki Post ->

.Net Core Eğitimleri

5-) Dto Katmanı ve AutoMapper

Dto Katmanı

Bu derste entitylerimiz ile veritabanından aldığımız verileri aktaracağımız ve ekleme,silme,güncelleme işlemleri öncesi verileri tutacağımız “Dto” katmanımızı oluşturacağız ve AutoMapper ‘ı projemize dahil edeceğiz. “Data transfer object” ler içlerinde business kod bulundurmazlar görevleri sadece verileri taşımak ve geçici olarak saklamaktır. Şimdi “Solution Explorer” içinden “Dto” projemize sağ tıklayalım “Add –> Class” diyerek yeni bir sınıf oluşturalım ve “OrganizationDto” olarak isimlendirelim. Artık yeni dosya oluşturma ekranlarını eklemeye gerek görmüyorum ancak bu konuda takıldığınız bir durum olur ise önceki derslere dönerek ekran görüntülerine bakabilirsiniz.

Dto Sınıflarının Oluşturulması

“Common” projesini oluştururken hazırladığımız “DtoBase” sınıfı oluşturduğumuz tüm “Dto” sınıfları için “base class” görevi görecek yani tüm “Dto” larımız bu sınıftan kalıtım alacak. “DtoBase” sınıfı “Common” projesi altında bulunduğu için “Dto” projemize sağ tıklayarak “Add –> Reference” diyoruz ve açılan pencereden “Common” projesini seçerek ekliyoruz. “OrganizationDto.cs” dosyasına çift tıklayarak içini aşağıdaki şekilde değiştiriyoruz.

Sırası ile aynı yönetmi uygulayarak “CustomerDto, LanguageDto, AppResourceDto, ApplicationRoleDto, ApplicationUserDto, ApplicationUserRoleDto” sınıflarınıda Dto projesine ekleyelim ve içeriklerini aşağıdaki gibi güncelleyelim.

CustomerDto.cs

LanguageDto.cs

AppResourceDto.cs

ApplicationRoleDto.cs

ApplicationUserDto.cs

ApplicationUserRoleDto.cs

AutoMapper

Dto ları ekledikten sonra sıra geldi AutoMapper alt yapısını oluşturmaya. Data katmanında eklediğimiz entityler daha öncede bahsettiğimiz gibi üzerlerinde CRUD işlemler yapmak için oluşturuldu. Görevleri sadece veritabanımızda bulunan tablolarımızı temsil etmek, yani son ana kadar bu sınıflara erişmek istemiyoruz, doğrudan bu katmana bir manipülasyon olmasını tercih etmiyoruz, araya Dto katmanını ekleyerek uygulama içerisinde aksiyon anına gelene kadar (Database gönderilecek CRUD komutları) verileri bu katman üzerinde tutacağız. Bu katmandaki sınıflar olabildiğince basit ve hiç bir şekilde business içermiyor. Peki her seferinde Dto to Entity ya da tam tersi Entity to Dto arasında veri akışını manuel mi kodlayacağız? Eğer hayatımızda AutoMapper çözümleri olmasaydı maalesef her bir sınıf içerisinde tekrar tekrar bu transferleri kodlayacaktık. Birde herhangi bir entitynin değiştiğini düşündüğünüzde bu durum kod yönetimini ve test odaklı yazılım geliştirme döngüsünün olmazsa olmaz refactoring aşamasını olumsuz etkileyecek bir hal alacaktı.

AutoMapper Nasıl Çalışır?

Kodların içerisinde bulunan yorumlarda da yazdığım gibi eğer entity ve dto sınıflarımızın property isimleri ve valueType ları aynı olur ise AutoMapper bu properylerin birbirine eşit olduğunu anlıyor ve hemen iki property arasında kaynak(source) –> hedef(target) ilişkisine göre veri transferi gerçekleştiriyor. Peki property isimleri aynı olmazsa ne oluyor? Burada da devreye AutoMapper’ın profile sınıfı altında bulunan genişletme kodları giriyor. Hedef ve kaynak arasında birbirine eşit propertyleri tek tek tanımlayarak bir mapping oluşturmuş oluyorsunuz ve isimleri aynı olmasa dahi bu iki propertyi maplediğiniz için veri transferi gerçekleşiyor. Herhangi bir property nin aktarılmasını istemiyorsanız ya da aktarılması esnasında değer içinde değişiklik yapmak istiyorsanız yine profile sınıfı içinde genişleme kodları ile bu işlemleri yapabilirsiniz.

AutoMapper Projeye Nasıl Eklenir?

Şimdi AutoMapper’ı projemize eklemek için aşağıdaki ekran görüntüsünde olduğu gibi Dto projemize sağ tıklayacağız ve Manage Nuget Packages diyerek nuget paket yöneticisini açacağız.

AutoMapper paketinin projeye eklenmesi - Mehmet Ali EROL
AutoMapper paketinin projeye eklenmesi

Daha sonra karşımıza gelen ekranda aşağıdaki adımları takip ederek projemize AutoMapper paketini dahil edeceğiz.

AutoMapper paketinin projeye eklenmesi 2 - Mehmet Ali EROL
AutoMapper paketinin projeye eklenmesi 2

AutoMapper Profile ile Mapleme

Bu işlemleri doğru bir şekilde yaptığımızda artık projemize AutoMapper’ı dahil ettik ve bu paketin altında bulunana Profile sınıfını kalıtım alan bir MappingProfile oluşturabiliriz.
Bunun için Dto projesine bir klasör ekliyoruz ve adına Mapper diyoruz (Bu klasörü oluşturmak zorunlu değil ben diğer sınıflardan ayrı bir yerde durmasını istediğim için bu klasörü açtım). Daha sonra bu klasöre sağ tıklayarak “Add –> Class” diyoruz ve oluşturacağımız sınıfın adına MappingProfile yazarak kaydediyoruz. Mapping yapabilmek için Dto projesine Data projesini referans vermeliyiz. Hemen Dto projesine sağ tıklayarak “Add –> Reference” diyoruz ve açılan pencereden Data projesini işaretleyerek kaydediyoruz. Son durumda Dto projemiz hem Common hem de Data projelerine bağımlı hale geldi.

MappingProfile.cs dosyasına çift tıklayarak içerisini aşağıdaki şekilde güncelliyoruz.

Sonuç

Dto ve AutoMapper işlemleri sonrası Solution Explorer Görüntüsü - Mehmet Ali EROL
Dto ve AutoMapper işlemleri sonrası Solution Explorer Görüntüsü

Bu işlemleri yaptığımızda artık Dto katmanımız ve AutoMapper alt yapımız hazır hale geliyor. İşlemleri doğru bir şekilde yaptı ise Solution Explorer üzerinde aşağıdaki gibi bir görüntü görüyor olmalıyız.

Projenin son haline github sayfam üzerinden bu link ile erişebilir ve buraya kadar yaptığımız işlemleri kontrol edebilirsiniz.

<- Önceki Post – Sonraki Post ->

.Net Core Eğitimleri

4-) Data Katmanı ve Migration

Data Katmanı

“Common” katmanını genel hatları ile oluşturduktan sonra sırada “Data” katmanımız var. Data katmanımızı code first migration yaparak veritabanımız üzerinde tabloları otomatik oluşturacak şekilde kurgulayacağız. “Solution Explorer” üzerinden Data projesinin üzerine sağ tıklayarak “Context” ve “Entites” isminde iki adet klasör ekliyoruz. İlk etapta bu klasörler boş olacak.”ConnectionString” tanımlamak için projeye bir ayar dosyası ekleyeceğiz ve bu dosyadan connection stringi okuyacağız. .Net Core öncesinde bu ayar dosyası xml formatında olur ve ismi web.config olurdu. Artık core ile birlikte json formatında bir ayar dosyası kullanılmakta.Tabi bu bir zorunluluk değil.

Biz projemize “appsettings.json” isminde bir dosya ekliyoruz. Aşağıda bulunan ekran görüntüsünde olduğu gibi önce arama kısmına “json” yazarak bir filtreleme yaptık ve sonuçlar içerisinden “JSON File” seçeneğini işaretleyerek, isim kısmına “appsettings.json”  yazdık.

appsettings.json dosyasının eklenmesi - Mehmet Ali EROL
appsettings.json dosyasının eklenmesi – Code First Migration

Connection String

Bu işlemi yaptıktan sonra “Solution Explorer” üzerinde gördüğümüz “appsettings.json” dosyasına çift tıklayarak açıyoruz ve içini aşağıdaki gibi düzenliyoruz.

Entity ‘lerin Oluşturulaması

Şimdi tek tek projemize entitylerimizi ekleyeceğiz, ekleyeceğimiz her bir class, “Common” katmanımızda kodladığımız “EntityBase” isimli sınıftan kalıtım(inheritance) alacak. “Entities” klasörüne sağ tıklayarak “Add –> Class” diyoruz ve açılan kısımda “Name” alanına
“Customer.cs” yazarak ekliyoruz. “Customer” bizim müşterilerimizin bilgilerini tutacak nesne olacak. “Customer” nesnesini oluşturduğumuz gibi “Organization”, “Language”, “AppResource” nesnelerini de oluşturalım. Bu nesneleri tamamen örnek olması açısından ekliyoruz ve projenin ilerleyen bölümlerinde bu nesneler üzerinde çeşitli işlemler yapacağız. “Organization” nesnesi bizim uygulamamız için firmaların bilgilerini tutacak, “Language” nesnesi çoklu dil alt yapısı kurmak için desteklenen dilleri tutacak ve “AppResource” nesnesi ise çevirilerin yer aldığı nesne olacak.

Bu sınıfların Common katmanında bulunan EntityBase nesnesinden kalıtım alabilmeleri için Common projesini referans olarak Data projesine eklemeliyiz.

Common projesinin referans olarak eklenmesi - Mehmet Ali EROL
Common projesinin referans olarak eklenmesi – Code First Migration
Common projesinin referans olarak eklenmesi 2 - Mehmet Ali EROL
Common projesinin referans olarak eklenmesi 2 – Code First Migration

Karşımıza çıkan pencereden Company.Application.Common seçeneğini seçili hale getiriyoruz.

Yukarıdaki şekilde referans ekleme işlemini yaparak, saydığımız nesneleri oluşturduktan sonra her birinin içeriğini aşağıdaki şekilde güncelleyelim.

Identity Altyapısı

Microsoft.AspNetCore.App paketinin projeye dahil edilmesi - Mehmet Ali EROL
Microsoft.AspNetCore.App paketinin projeye dahil edilmesi – Code First Migration

Projemizde Identity alt yapısını kullanarak authentication ve authorization işlemlerini yapacağımız için “IdentityUser” nesnesinden kalıtım alan ve kullanıcılarımızın bilgileri saklayacağımız class’ımızı oluşturuyoruz.
Entities klasörüne sağ tıklayarak “Add –> Class” yolunu izliyoruz ve yeni dosya ekleme kutusunda “Name” alanına “ApplicationUser.cs” yazıyoruz. Bu nesne bizim uygulamamızı kullanacak kişilerin bilgilerini barındıracak ve “IdentityUser” base classından kalıtım alacak.
“IdentityUser” nesnesini kalıtım alabilmek için aşağıdaki ekran görüntüsünde de görüldüğü gibi “Data” projesine sağ tıklayarak “Manage Nuget Packages” seçeneğine tıklıyoruz.

Ardından karşımıza nuget paket yöneticisi ekranı gelecek. Yine aşağıdaki ekran görüntüsünü takip ederek arama kısmına “Microsoft.AspNetCore.App” yazarak arama yapıyoruz ve 2 nolu ok ile işaret edilen seçeneğe tıklıyoruz.  En son 3 nolu ok ile işaret edilen Install butonuna tıklıyoruz. Genelde bu işlemleri yaptığınızda kısa bir bekleme sonrasında size bir onay kutusu gösterir, devam edebilmek için gelen ekranda “Kabul Ediyorum (I Accept)” seçeneğini tıklayalım. Aynı işlemi bu projeye referans verdiğiniz Common projesi için de yapacağız. Lütfen aynı adımları uygulayarak Common projesinede “Microsoft.AspNetCore.App” bağımlılığını yükleyelim.

Microsoft.AspNetCore.App paketinin projeye dahil edilmesi 2 - Mehmet Ali EROL
Microsoft.AspNetCore.App paketinin projeye dahil edilmesi 2 – Code First Migration

IdentityUser

Bu işlemi yaptıktan sonra artık “ApplicationUser.cs” dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz. Koda dikkat edecek olursanız sınıfımız “IdentityUser” base sınıfından kalıtım aldı. “IdentityUser” üzerine tıklayarak klavyeden “F12” tuşuna basabilir ve bu sınıfın içinde ne gibi property ler olduğuna bakabilirsiniz.

IdentityRole

ApplicationUser’ı ekledikten ve gerekli düzenlemeleri yaptıktan sonra Entities klasörüne sağ tıklayarak “Add –> Class” yolunu izliyoruz ve  Rollerimiz için ApplicationRole isimli bir sınıf oluşturuyoruz. Nasıl ki ApplicationUser sınıfımız IdentityUser sınıfından kalıtım aldı ise ApplicationRole sınıfımızda IdentityRole sınıfını kalıtım alacak. Dosyayı ekledikten sonra ApplicationRole.cs dosyasına çift tıklıyoruz ve aşağıdaki şekilde içerisini güncelliyoruz.

Şimdi kullanıcılar ve rollerin eşleştirildiği ApplicationUserRole isimli bir sınıf oluşturacağız ve bu sınıf IdentityUserRole sınıfından kalıtım alacak. Identity alt yapısında kullanıcı yönetimi için UserManager sınıfı kullanılıyorve bu sınıf ile biz sadece kullanıcıya ait rollerin adını alabiliyoruz. Bu nedenle entity framework alt yapısı ile Identityi birleştireceğiz. Entities klasörü içerisine oluşturduğumuz ApplicationUserRole.cs dosyasına çift tıklayarak içeriğini aşağıdaki gibi düzenliyoruz.

Diğer Identity Sınıfları

Entities klasörüne sağ tıklayarak ApplicationUserRole isminde yeni bir sınıf oluşturuyoruz. Bu sınıf bizim User ve Role lerimizin birleşim tablosu yani many to many relation tablomuz olacak. Bu sınıfı ve bundan sonra oluşturacağımız ApplicationUserToken ve ApplicationUserLogin sınıflarını oluşturmak zorunlu değil ancak bu sınıflarda bir id property si bulunmuyor bu nedenle ilerleyen derslerde göreceğimiz AutoHistory ve ApiBase sınıflarımızda sorunlar yaşamamak için ekliyoruz. Identity alt yapısında başka sınıflarda mevcut ancak o sınıflarda Id propertyleri olduğu için bir sorun yok. Siz mevcut Identity sınıflarını genişletecek başka özellikler ekleyecekseniz dbcontext constructor metodunda generic type olarak verdiğimiz tüm Identity sınıflarından kalıtım alan kendi sınıflarınızı oluşturabilirsiniz.

Sırası ile ApplicationUserRole (IdentityUserRole’den kalıtım alacak), ApplicationUserToken(IdentityUserToken’dan kalıtım alacak) ve ApplicationUserLogin(IdentityUserLogin’den kalıtım alacak) sınıflarımızı oluşturacağız bunlar bizim kendi sınıflarımız isimlerine istediğimizi verebiliriz.

ApplicationUserRole

ApplicationUserToken

ApplicationUserLogin

DbContext

Artık son aşamaya geldik diyebiliriz. Bu aşamada “DbContext” imizi oluşturacağız. Normal şartlarda oluşturacağımız context sınıfı “DbContext” sınıfından kalıtım alacaktı ancak biz projemizde “IdentityUser” alt yapısını kullandığımız için context sınıfımız generic olan “IdentityDbContext<>” sınıfından kalıtım alacak. Bu generic sınıf tip olarak içerisine IdentityUser’ı kalıtım almış bir sınıfı ve IdentityRole sınıfını kalıtım almış diğer bir sınıfı beklemektedir ki bizde bir adım öncesinde bu sınıfları oluşturmuştuk. Yazının başında oluşturduğumuz “Context” isimli klasöre sağ tıklayalım ve “New –> Class” diyerek yeni bir sınıf oluşturalım ve sınıfımızın adına “ApplicationDbContext.cs” diyelim. Daha sonra bu dosyaya çift tıklayarak içeriğini aşağıdaki gibi düzenleyelim.

Migration Altyapısı

Migration yapabilmek için IDesignTimeDbContextFactory isimli generic interface’i implemente eden bir sınıf oluşturacağız ve bu interface’e oluşturduğumuz ApplicationDbContext sınıfını tip olarak göndereceğiz.
Context klasörümüze sağ tıklayarak “Add –> Class” yolunu izliyoruz ve Name alanına DesignTimeDbContextFactory.cs yazarak kaydediyoruz. Oluşturduğumuz dosyaya çift tıklayarak içini aşağıdaki şekilde düzenliyoruz.

Code First Migration

Migration ekleme işlemi - Mehmet Ali EROL
Migration ekleme işlemi – Code First Migration

Mssql management studio görüntüsü - Mehmet Ali EROL
Mssql management studio görüntüsü – Code First Migration
Update database komutu ile veritabanı oluşturma işlemi - Mehmet Ali EROL
Update database komutu ile veritabanı oluşturma işlemi – Code First Migration

Tüm işlemleri yaptığımızda artık “code first” yaklaşımı ile veritabanımızı kodlamış oluyoruz. Tabiki daha sonradan eklenecek tablolar ve sütunlar olacaktır. Biz projemizin veritabanının bu hali ile “MsSQL server” üzerinde oluşturulması için migration işlemi yapacağız. “Migration” işlemi oluşturduğumuz “ApplicationDbContext” içerisindeki ayarları ve “DbSet” ile tanımladığımız tabloları bizim belirlediğimiz kurallar çerçevesinde “MsSQL” üzerinde oluşturma işlemidir diyebiliriz. Bu işlemi “Package Manager Console”(biz artık PMC diyeceğiz) üzerinden yapacağız. Eğer PMC yi ekranda göremiyorsanız, “Tools” menüsünden “Nuget Packege Manager — > Package Manager Console” yolunu izleyerek açabilirsiniz.

Add-Migration Komutu

PMC ye tıklayarak  “Add-Migration migrationAdı”  şeklinde bir komut yazacağız. Bu migration bizim için ilk olacağından dolayı ben adına ilk anlamına gelen “initial” ismini vereceğim.  Bu işlemi yaparken PMC üzerinde “Default project” alanında “Data” projemizin seçili olduğundan emin oluyoruz ve aynı zamanda Data projemize sağ tıklayarak “Set as Startup Project” demeyide unutmuyoruz.

İşlemleri doğru bir şekilde yaptıysak “Solution Explorer” üzerinde aşağıdaki gibi bir ekran görüntüsü görmemiz gerekiyor.

Peki buraya kadar yaptıklarımız code first ile oluşturduğumuz database tasarımının MsSQL üzerinde oluşmasını sağladı mı? Sorunun cevabını verebilmek için hemen MsSQL Management Studio yu açıyoruz. Databases kısmında connection string içinde belirttiğimiz üzere ApplicationDB isminde bir veritabanı olması gerekiyor. Ama aşağıdaki ekran görüntüsünden de anlaşılacağı üzere veritabanı listede görünmüyor.

Update-Database Komutu

Veritabanının oluşmaması gayet normal çünkü biz şuana kadar sadece migration oluşturduk yani veritabanı oluşturmak için gereken son hamleyi henüz yapmadık. Migration ile bir plan hazırladık, yani örnek üzerinden gidecek olursa arabanın çalışması için gereken herşeyi oluşturduk sadece marşa basmak kaldı. O zaman yine PMC üzerinden update-database komutunu girerek marşa basalım.

Bu işlem sonrasın tekrar MsSQL Management Studio üzerinden kontrollerimizi yapıyoruz ve veritabanımızın oluşup oluşmadığını kontrol ediyoruz.

Sizde yukarıdaki ekran görüntüsünü görüyorsanız işlemleri doğru bir şekilde yapmışız demektir. Farkettiyseniz identity yapısını projemize dahil ettiğimiz için Identity tabloları veritabanında otomatik olarak oluşturuldu. Herhangi bir adımda hata ile karşılaştıysanız ya da kendi kodunuz ile benim yazdığım kodu karşılaştırmak istiyorsanız projenin son haline github sayfamdan ulaşmak için bu link ‘e tıklayabilirsiniz.

<- Önceki Post – Sonraki Post ->