.Net Core 3 Üzerinde AutoMapper ve Entity Framework Araçları

Selamlar bu makalede, bana gelen sorulardan, .Net Core üzerinde bir Entity’i kaydetmek için, tüm kolonlarını tek tek set mi etmeliyiz sorusuna cevap arayacağız.

Öncelikle aşağıdaki tablolar sqlDB’de oluşturulur.

Sıra geldi .Net Corer bir WebApi proje oluşturmaya:

Şimidi sıra geli DBContext’i DB First şeklinde oluşturmaya. Makinamda kurulu .Net Core 3.0 Versiyonu aşağıdaki gibidir.

Makinanızda dotnet ef tool’un kurulu olup olmadığı aşağıdaki komut ile kontrol edilir.

Eğer makinanızda “ef tools” yok ise, aşağıdaki komut ile “dotnet ef” tools global olarak yüklenir. ef tools’un amacı, Database First mantığında DB’den ilgili DB Context’in ve entity sınıflarının oluşturulmasını sağlamaktır.

EntityFrameworkCore’a ait SqlServer, SqlServer.Design ve Tools kütüphaneleri aşağıdaki gibi eklenir.

Sıra geldi aşağıdaki komut ile, Automapper projesinde Models/DB altında DBContext’in oluşturulmasına. Alttaki komut ile gösterilen DB’ye ait Db Context ve Entityler “Models/DB” klasörünün altında oluşturulur.

Program.cs altına, Kesterl custom port’un değiştirilmesi için aşağıdaki satır eklenir.

Projeye Dependency Injection ile QuizContext aşağıdaki gibi eklenir. Amaç, proje ayağa kalkerken ilgili context’in bir kere oluşturulmasını sağlamak ve ihtiyaç anında tekrar tekrar oluşturulması yerine constructorda alınarak kullanılmasının sağlamaktır.

Startup.cs/ConfigurationServices():

appsettings.json‘a aşağıdaki “DefaultConnection” tanımlanır. Bu Sql DB erişim için gerekli olan connection stringdir.

Aşağıdaki gibi bir sorgu çekildiğinde, Question model’ine ait 4 kolon gelmektedir. Bu örnekte view model olarak, sadece “id” ve “text” alanları  kullanılmak istenmiştir.

Not: Kısaca 100 kolonu olan bir entity’nin View’da sadece 5 kolonuna ihtiyacımız var ise ayrıca bir viewModel oluşturulmalıdır.

QuizController.cs : Aşağıda, örnek amaçlı istenen bir Id’ye göre kayıt çeken bir servis yazılmıştır. İlgili QuizContext constructor’da alınmıştır.

İlgili servisden dönen sonuç, aşağıdaki gibidir.

Model/IViewQuestion.cs: View’da görünmesi istenen kolonlar için, aşağıdaki ViewQuestion model oluşturulur.

Model/ViewQuestion.cs:

ViewQuestion modelinin services’de dependency injection ile kullanılabilmesi için, ConfigureService’e aşağıdaki gibi singleton eklenmesi gerekmektedir.

Startup.cs/ConfigurationServices():

Şimdi sıra AutoMapper’ı projeye eklemeye geldi.

AutoMapper’ın amacı : View’dan Entity’e veya Entity’den View’a gelirken, eşitlenme anında ayarlanan kolonların belirtilen konfigürasyonlar ile otomatik olarak atanması sağlamaktır.

Görümesi istenen Viewmodel’i (ViewQuestion)’ı ve data çekilen model’i (Question)’ı tanımladık.

Şimdi sırada AutoMapper’ı tanımlamaya geldi.

QuizMapper.cs: Bu kısım, View’da görünmesi istenen  kolonların, Db’den gelen data ile ya da tam tersi şekilde eşleştirildiği kısımdır.

  • CreateMap<ViewQuestion, Question>() : ViewModel’den Entity’ye doğru olan bir eşleşme.
  • CreateMap<Question, ViewQuestion>() : DB’den çekilen datanın ViewModel’e doldurulması.
  • .ForMember(q => q.CustomName, opt => opt.MapFrom(s => “Category:” + s.CategoryId + “- Id:” + s.Id)) : ViewModel’de bulunu “CustomName“‘in DB’deki Question tablosunda karşılığı yoktur. Bu neden ile CategoryID ve Id, alanları birleştirilerek özel bir kolon oluşturulmuştur. Kısaca Mapleme işlemi sırasında, araya girilmiştir.
  • ForMember(q => q.Id, opt => opt.Ignore()) : DB’den gelen “Id” alanının, ViewModel’a atanması engellenmiştir. “Ignore()“. View’da Id alanı, maplenmediği için 0 gözükecektir.

Sıra geldi AutoMapper’ın .Net Core tarafında tanımlanmasına.

Startup.cs / ConfigureServices() : Aşağıda görüldüğü gibi yukarıda tanımlanan QuizMapper, IMapper interface’inden türeyen mapper nesnesinin oluşturulmasında, config olarak kullanılmıştır. Ve .Net Core projeye mapper nesnesi singleton olarak eklenerek, automapper tanımlaması yapılmıştır.

Kullanım Şekli : QuizController  sınıfının Constructor’ında “IMapper mapper” Dependency Injection ile alınır. İlgili mapleme işi, “_mapper.Map<ViewQuestion>(data)” bu satır ile yapılmaktadır. DB’den gelen data, ViewModel için QuizMapper’da yapılan tanımlamalar ile istenen yapıya dönüştürülür.

Query’nin son görünüm hali, aşağıdaki gibidir : Aşağıda görüldüğü gibi id alanı Ignore edildiği için “0” gelmiştir. Ayrıca olmayan “customName” alanı, automapper sayesinde doldurulmuştur.

Update : Aşağıda bir güncelleme işleminde çalışacak Action() method tanımlanmıştır. Burada özel bir durum vardır. ViewModel, DataModel’den farklıdır. Bu durumda “CategortyId” ve “IsActive” kolonları viewmodel’den gelemiyeceği için, önce var olan datadan çekilmiş ve güncelleme anında tekrar atanmıştır. Normal şartlar altında, eksik kolonların olduğu Custom Viewlarda, update işlemi mümkün olduğunca tercih edilmemelidir.

Not: View ve Data  modellerin eşleştiği durumlarda, bu örnekte Update anında Automapper ile gelen view modelin ilgili entity’ye maplenmesi yeterli olacaktır.

Postman: Postman ile Update() Action’a gönderilen ViewModel örneği, son olarak aşağıdaki gibidir.

Geldik bir makalenin daha sonuna. Bu makalede .Net Core bir projede, Automapper kullanılarak kayıt çekme ve kaydetme sırasında nasıl araya girilinebileceği ve Entity’e bir kayıt atmak için tek tek kolonların eşitlenmesinden nasıl kaçınılabileceği gösterilmiştir. Ayrıca mapleme işleminde araya girilerek, custom yeni bir kolon oluşturulmuş hatta bir başka kolon da tamamı ile ihmal edilmiştir. Kolon sayısı 50 ve üzeri olan Entitylerde, Crud işlemleri sırasında çokça zaman kazandıran Automapper’ı, şiddet ile tavsiye ederim. Ayrıca CustomViewların olduğu sayfalarda, Automapper ile Update işleminden uzak durmanızı da öneririm. Aksi takdirde bu örnekte olduğu gibi, araya girip eksik veya farklı kolonlar için ayrıca birtakım işlemler yapmak zorunda kalabilirsiniz.

Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Source :

  • https://github.com/AutoMapper/AutoMapper
  • https://stackoverflow.com/questions/40275195/how-to-set-up-automapper-in-asp-net-core
  • https://dotnettutorials.net/lesson/ignore-using-automapper-in-csharp/

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

4 Cevaplar

  1. Ahmet dedi ki:

    Teşekkürler

  2. engin hazar dedi ki:

    yalın güzel anlatmışsınız teşekkürler

Bir cevap yazın

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