FLUENT API KULLANARAK ÇOKA-ÇOK İLİŞKİNİN YAPILMASI

Bu dersimizde de fluent api ile çoka çok ilişki yapacağız. Bizim daha önceden data annotations ile yaptığımız senaryodaki senaryoyu gerçekleştirelim. Kitap ve Yazar tabloları arasındaki çoka çok ilişkiyi ele alalım. Bir kitabın birden fazla yazarı olabilir demiştik aynı şekilde bir yazarın da birden fazla kitabı olur demiştik. Dolayısı ile bu durum çoka çok ilişki olarak ele alınır. Bunu da bir ara tablo ile yani mapping tablo ile gerçekleştirmiştik.

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

Fluent api ile bunu gerçekleştirme işlemine de başlayalım. İşin özü iki tane bire çok ilişki oluşturacağım. Bu iki bire çok ilişkim benim mapping tablom yani ara tablomda olacaklar. Bu ilişkilerde ben foreign key tanımlaması yapacağım. Bir de her iki ID bilgisi içeren kolonlarımı da primary key yapacağım.

Şimdi bunu yapalım. FluntApi_Kitap classıma geliyorum. Kodlarımı yazıyorum.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_Model.Models
{
    [Table("tb_Kitap")]
    public class FluentApi_Kitap
    {
               

        public int Kitap_Id { get; set; }

        
        public string KitapAdi { get; set; }

       
        public double Fiyat  { get; set; }

        
        public string ISBN { get; set; }

        public int KitapDetay_Id { get; set; }

        public FluentApi_KitapDetay FluentApi_KitapDetay { get; set; }

        public int YayinEvi_Id { get; set; }
        public FluentApi_YayinEvi FluentApi_YayinEvi { get; set; }

        public ICollection< FluentApi_KitapYazar> FluentApi_KitapYazarlar { get; set; }
    }
}

Aynı property FluentApi_Yazar classı içinde de olacak.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_Model.Models
{
    [Table("tb_Yazar")]
    public class FluentApi_Yazar
    {
        
        public int Yazar_Id { get; set; }

        
        public string YazarAd { get; set; }

        
        public string YazarSoyad { get; set; }

        public string Lokasyon { get; set; }
        public DateTime DogumTarihi { get; set; }

        
        public string AdSoyad
        {
            get 
            { return $"{YazarAd}  {YazarSoyad}";
            
            }
        }

        public ICollection< FluentApi_KitapYazar> FluentApi_KitapYazarlar { get; set; }



    }
}

Daha sonra buradan ara tabloma geçiyorum, yani FluentApi,_KitapYazar tablom içinde kodlarımı düzenliyorum:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GRSYKitapEvi_Model.Models
{
    public class FluentApi_KitapYazar
    {
        
        public int Kitap_Id { get; set; }

        
        public int Yazar_Id { get; set; }

        public FluentApi_Kitap Fluent_Kitap { get; set; }
        public FluentApi_Yazar Fluent_Yazar { get; set; }

        
    }
}

Buraya da iki tane navigation property ekledim. Şimdi ApplicationDbContext classıma geçiyorum. Burada ilişkileri yazacağım.

Eklenecek kısım:

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

Tamamı:

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 });


            //FluentApi_KitapDetay İçin
            modelBuilder.Entity< FluentApi_KitapDetay>().HasKey(a => a.KitapDetay_Id);
            modelBuilder.Entity< FluentApi_KitapDetay>().Property(a => a.BolumSayisi).IsRequired();


            //FluentApi_Kitap için
            modelBuilder.Entity< FluentApi_Kitap>().HasKey(a => a.Kitap_Id);
            modelBuilder.Entity< FluentApi_Kitap>().Property(a => a.KitapAdi).IsRequired();
            modelBuilder.Entity< FluentApi_Kitap>().Property(a => a.Fiyat).IsRequired();
            modelBuilder.Entity< FluentApi_Kitap>().Property(a => a.ISBN).IsRequired().HasMaxLength(13);

            //FluentApi_Kitap ile FluentApi_KitapDetay tabloları arasında bire bir ilişki
            modelBuilder.Entity< FluentApi_Kitap>().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.Entity< FluentApi_Kitap>().HasOne(a => a.FluentApi_YayinEvi).WithMany(a => a.FluentApi_Kitap).HasForeignKey(a => a.YayinEvi_Id);


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


            //FluentApi_Yazar
            modelBuilder.Entity< FluentApi_Yazar>().HasKey(a => a.Yazar_Id);
            modelBuilder.Entity< FluentApi_Yazar>().Property(a => a.YazarAd).IsRequired();
            modelBuilder.Entity< FluentApi_Yazar>().Property(a => a.YazarSoyad).IsRequired();
            modelBuilder.Entity< FluentApi_Yazar>().Ignore(a => a.AdSoyad);

            //FluentApi_YayinEvi
            modelBuilder.Entity< FluentApi_YayinEvi>().HasKey(a => a.YayinEvi_Id);
            modelBuilder.Entity< FluentApi_YayinEvi>().Property(a => a.YayinEviAdi).IsRequired();
            modelBuilder.Entity< FluentApi_YayinEvi>().Property(a => a.Lokasyon).IsRequired();

            //Kategori Tablo Ad ve Kolon Ad
            modelBuilder.Entity< Kategori>().ToTable("tbl_Kategori");
            modelBuilder.Entity< Kategori>().Property(b=>b.KategoriAd).HasColumnName("KategoriAdi");

        }
    }
}

Akabinde package manager console ekranımda add-migration EkleCokaCokIliskiFluentApiKitap_FluentApiYazarFluentApiYazar diyorum ve migration oluşturuluyor.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleCokaCokIliskiFluentApiKitap_FluentApiYazar : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "FluentApi_KitapYazar",
                columns: table => new
                {
                    Kitap_Id = table.Column< int>(type: "int", nullable: false),
                    Yazar_Id = table.Column< int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_FluentApi_KitapYazar", x => new { x.Yazar_Id, x.Kitap_Id });
                    table.ForeignKey(
                        name: "FK_FluentApi_KitapYazar_tb_Kitap_Kitap_Id",
                        column: x => x.Kitap_Id,
                        principalTable: "tb_Kitap",
                        principalColumn: "Kitap_Id",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_FluentApi_KitapYazar_tb_Yazar_Yazar_Id",
                        column: x => x.Yazar_Id,
                        principalTable: "tb_Yazar",
                        principalColumn: "Yazar_Id",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateIndex(
                name: "IX_FluentApi_KitapYazar_Kitap_Id",
                table: "FluentApi_KitapYazar",
                column: "Kitap_Id");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "FluentApi_KitapYazar");
        }
    }
}

Daha sonra package manager console ekranımda update-database diyor ve veritabanımı güncelliyorum.

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

Bir cevap yazın

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