FLUENT API KOD DÜZENLEMELERİ

Yazdığmız kodlar içinde ApplicationDbContext clasımda OnModelCreating metodu altında yazdığım kodları incelediğimde çok uzun ve yoğun bir kod kullanımı mevcut. Aslında bu bizim clean code mantığına ters bir durum. Yani hatalı denilemez, işimizi görür, ama organize edilmiş bir kod düzeni değil. Bu derste de şimdi bu kısımları toparlamayı hedefleyelim.

Detaylı ders anlatımı ve kod takibi için video:

Öncelikle projemde Data Acccess katmanıma geliyor ve yeni bir klasör ekliyorum. Klasörüme FluentApiKonfigurasyon adını verdim. Ben buraya FluentApi için oluşturduğum tüm classlara ilişkin olarak bir konfigürasyon classları oluşturacağım.

FluentApiKonfigurasyon klasörüme sağ tıklıyor ve bir class eklyior adını da FluentApiYayinEviKonfigurasyon veriyorum. Geliyor ve kodlarımı düzenliyorum.

using GRSYKitapEvi_Model.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon
{
    public class FluentApiYayinEviKonfigurasyon : IEntityTypeConfiguration< FluentApi_YayinEvi>
    {
        public void Configure(EntityTypeBuilder< FluentApi_YayinEvi> modelBuilder)
        {
            //FluentApi_YayinEvi
            modelBuilder.HasKey(a => a.YayinEvi_Id);
            modelBuilder.Property(a => a.YayinEviAdi).IsRequired();
            modelBuilder.Property(a => a.Lokasyon).IsRequired();
        }
    }
}

FluentApiKonfigurasyon klasörüme sağ tıklıyor ve bir class eklyior adını da FluentApiYazarKonfigurasyon veriyorum. Geliyor ve kodlarımı düzenliyorum.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon
{
    public class FluentApiYazarKonfigurasyon : IEntityTypeConfiguration< FluentApi_Yazar>
    {
        public void Configure(EntityTypeBuilder< FluentApi_Yazar> modelBuilder)
        {
            //FluentApi_Yazar
            modelBuilder.HasKey(a => a.Yazar_Id);
            modelBuilder.Property(a => a.YazarAd).IsRequired();
            modelBuilder.Property(a => a.YazarSoyad).IsRequired();
            modelBuilder.Ignore(a => a.AdSoyad);
        }
    }
}

FluentApiKonfigurasyon klasörüme sağ tıklıyor ve bir class eklyior adını da FluentApiKitapKonfigurasyon veriyorum. Geliyor ve kodlarımı düzenliyorum.

using GRSYKitapEvi_Model.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon
{
    public class FluentApiKitapKonfigurasyon : IEntityTypeConfiguration< FluentApi_Kitap>
    {
        public void Configure(EntityTypeBuilder< FluentApi_Kitap> modelBuilder)
        {
            //FluentApi_Kitap için
            modelBuilder.HasKey(a => a.Kitap_Id);
            modelBuilder.Property(a => a.KitapAdi).IsRequired();
            modelBuilder.Property(a => a.Fiyat).IsRequired();
            modelBuilder.Property(a => a.ISBN).IsRequired().HasMaxLength(13);

            //FluentApi_Kitap ile FluentApi_KitapDetay tabloları arasında bire bir ilişki
            modelBuilder.HasOne(a => a.FluentApi_KitapDetay).WithOne(a => a.FluentApi_Kitap).HasForeignKey< FluentApi_Kitap>("KitapDetay_Id");

            //FluentApi_Kitap ile FluentApi_YayinEvi tabloları arasında bire çok ilişki
            modelBuilder.HasOne(a => a.FluentApi_YayinEvi).WithMany(a => a.FluentApi_Kitap).HasForeignKey(a => a.YayinEvi_Id);
        }
    }
}

FluentApiKonfigurasyon klasörüme sağ tıklıyor ve bir class eklyior adını da FluentApiKitapYazarKonfigurasyon veriyorum. Geliyor ve kodlarımı düzenliyorum.

using GRSYKitapEvi_Model.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon
{
    public class FluentApiKitapYazarKonfigurasyon : IEntityTypeConfiguration< FluentApi_KitapYazar>
    {
        public void Configure(EntityTypeBuilder< FluentApi_KitapYazar> modelBuilder)
        {

            //FluentApi_Kitap ile FluentApi_Yazar tabloları arasında çoka çok ilişki
            modelBuilder.HasKey(ab => new { ab.Yazar_Id, ab.Kitap_Id });
            modelBuilder.HasOne(a => a.Fluent_Kitap).WithMany(a => a.FluentApi_KitapYazarlar).HasForeignKey(a => a.Kitap_Id);
            modelBuilder.HasOne(a => a.Fluent_Yazar).WithMany(a => a.FluentApi_KitapYazarlar).HasForeignKey(a => a.Yazar_Id);
        }
    }
}

FluentApiKonfigurasyon klasörüme sağ tıklıyor ve bir class ekliyor adını da FluentApiKitapDetayKonfigurasyon veriyorum. Geliyor ve kodlarımı düzenliyorum.

using GRSYKitapEvi_Model.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon
{
    public class FluentApiKitapDetayKonfigurasyon : IEntityTypeConfiguration< FluentApi_KitapDetay>
    {
        public void Configure(EntityTypeBuilder< FluentApi_KitapDetay> modelBuilder)
        {
            //FluentApi_KitapDetay İçin
            modelBuilder.HasKey(a => a.KitapDetay_Id);
            modelBuilder.Property(a => a.BolumSayisi).IsRequired();

        }
    }
}

Şimdi ApplicationDbContext classıma geri dönüyor ve yeni alanlarımı yeni configure dosyalarımı buraya refere ediyorum.

using GRSYKitapEvi_DataAccess.FluentApiKonfigurasyon;
using GRSYKitapEvi_Model.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_DataAccess.Data
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions< ApplicationDbContext> options) : base(options)
        {

        }

        public DbSet< Kategori> Kategoriler { get; set; }
        public DbSet< Tur> Turler { get; set; }
        public DbSet< Kitap> Kitaplar { get; set; }
        public DbSet< KitapDetay> KitapDetaylar { get; set; }
        public DbSet< YayinEvi> YayinEvleri { get; set; }
        public DbSet< Yazar> Yazarlar { get; set; }
        public DbSet< KitapYazar> KitapYazarlar { get; set; }
       

        public DbSet< FluentApi_KitapDetay> FluentApi_KitapDetaylar { get; set; }
        public DbSet< FluentApi_Kitap> FluentApi_Kitaplar { get; set; }
        public DbSet< FluentApi_Yazar> FluentApi_Yazarlar { get; set; }
        public DbSet< FluentApi_YayinEvi> FluentApi_YayinEvleri { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //Composite key oluşturma
            modelBuilder.Entity< KitapYazar>().HasKey(x => new { x.Yazar_Id, x.Kitap_Id });
             
            //Kategori Tablo Ad ve Kolon Ad
            modelBuilder.Entity< Kategori>().ToTable("tbl_Kategori");
            modelBuilder.Entity< Kategori>().Property(b=>b.KategoriAd).HasColumnName("KategoriAdi");



            modelBuilder.ApplyConfiguration(new FluentApiKitapDetayKonfigurasyon());
            modelBuilder.ApplyConfiguration(new FluentApiKitapKonfigurasyon());
            modelBuilder.ApplyConfiguration(new FluentApiKitapYazarKonfigurasyon());
            modelBuilder.ApplyConfiguration(new FluentApiYayinEviKonfigurasyon());
            modelBuilder.ApplyConfiguration(new FluentApiYazarKonfigurasyon());




        }
    }
}

Bir sonraki derste görüşmek üzere.

Bir cevap yazın

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