FLUENT API KULLANARAK BİRE-BİR VE BİRE-ÇOK İLİŞKİNİN YAPILMASI

Bu dersimizde bire bir ilişkinin fluent api ile kullanımına değinmek istiyorum. Şimdi bizim bir Kitap tablomuz bir de KitapDetay tablomuz mevcut. Bu iki tablo birbiri ile Kitap tablosu üzerinden eşleşmiş durumda. Kitap tablosunun içinde bir KitapDetay_Id olarak navigation property ve bir KitapDetay olarak bir nesne mevcut olacak. KitapDetay tablosunda ise Kitap nesnemiz olacak. Böylelikle bire bir ilişki kuruluyor. Bunu yapabilmek için örneğimde yer alan FluentApi_Kitap tabloma geliyor ve kodlarımı düzenliyorum.

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

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

        


    }
}

Burada öncelikle KitapDetay_Id ile bir navigation property ekledim. Akabinde FluentApi_KitapDetay tablosundan bir nesne türettim.

FluentApi_KitapDetay model classıma geçip kodlarımı düzenliyorum:

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

namespace GRSYKitapEvi_Model.Models
{
    public class FluentApi_KitapDetay
    {
        
        public int KitapDetay_Id { get; set; }

        
        public int BolumSayisi { get; set; }

        public int KitapSayfasi { get; set; }

        public double Agirlik { get; set; }

        public FluentApi_Kitap FluentApi_Kitap { get; set; }

        
    }
}

Burada da bire bir ilişki kuracağım FluentApi_Kitap tablosu için bir nesne türettim. ApplicationDbContet tarafına geçiyorum ve kodlarımı düzenliyorum.

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_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");

        }
    }
}

Buraya da aşağıdaki kodları ekledim.

//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");

Böylelikle ben FluentApi_Kitap ve FluentApi_KitapDetay tabloları arasında birebir ilişki kurdum. Şimdi migration oluşturuyorum, package manager console’da add-migration EkleFluentApiBireBirIliskiFluentApiKitapveFluentApiKitapDetay diyorum. Migration oluşturuldu.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleFluentApiBireBirIliskiFluentApiKitapveFluentApiKitapDetay : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn< int>(
                name: "KitapDetay_Id",
                table: "tb_Kitap",
                type: "int",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.CreateIndex(
                name: "IX_tb_Kitap_KitapDetay_Id",
                table: "tb_Kitap",
                column: "KitapDetay_Id",
                unique: true);

            migrationBuilder.AddForeignKey(
                name: "FK_tb_Kitap_FluentApi_KitapDetaylar_KitapDetay_Id",
                table: "tb_Kitap",
                column: "KitapDetay_Id",
                principalTable: "FluentApi_KitapDetaylar",
                principalColumn: "KitapDetay_Id",
                onDelete: ReferentialAction.Cascade);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_FluentApi_KitapDetaylar_KitapDetay_Id",
                table: "tb_Kitap");

            migrationBuilder.DropIndex(
                name: "IX_tb_Kitap_KitapDetay_Id",
                table: "tb_Kitap");

            migrationBuilder.DropColumn(
                name: "KitapDetay_Id",
                table: "tb_Kitap");
        }
    }
}

package manager console’da update-database yazıyor ve veritabanımı güncelliyorum.

FLUENT API İLE BİRE ÇOK İLİŞKİ NASIL YAPILIR?

Şimdi de gelelim bire çok ilişkiye.

Bu seferde yine Kitap ve YayınEvi tablolarını düşünelim. Benim senaryoma göre bir kitabın tek bir yayınevi olacak. Ama bir yayınevi içinde birden fazla kitap olabilir. Dolayısı ile bu iki tablo arasında bire çok ilişki vardır. Bunu yapabilmek için FluentApi_Kitap tabloma geliyor ve 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
{
    [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; }


    }
}

Burada öncelikle YayinEvi_Id ile bir navigation property ekledim. Akabinde FluentApi_YayinEvi tablosundan bir nesne türettim.

FluentApi_YayinEvi model classıma geçip 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
{
    [Table("tb_YayinEvi")]
    public class FluentApi_YayinEvi
    {

        public int YayinEvi_Id { get; set; }


        public string YayinEviAdi { get; set; }


        public string Lokasyon { get; set; }

        public List< FluentApi_Kitap> FluentApi_Kitap { get; set; }

    }
}

Burada da bire çok ilişki kuracağım FluentApi_Kitap tablosu için bir nesne türettim. Dikkat ederseniz List olarak ekliyorum,çünkü bire çok ilişki olacak.

ApplicationDbContet tarafına geçiyorum ve kodlarımı düzenliyorum.

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_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");

        }
    }
}

Buraya da aşağıdaki kodları ekledim.

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

Böylelikle ben FluentApi_Kitap ve FluentApi_YayinEvi tabloları arasında bire – çok ilişki kurdum. Şimdi migration oluşturuyorum, package manager console’da add-migration kleFluentApiBireCokIliskiFluentApiKitapVeFluentApiYayinEvi diyorum. Migration oluşturuldu.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleFluentApiBireCokIliskiFluentApiKitapVeFluentApiYayinEvi : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn< int>(
                name: "YayinEvi_Id",
                table: "tb_Kitap",
                type: "int",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.CreateIndex(
                name: "IX_tb_Kitap_YayinEvi_Id",
                table: "tb_Kitap",
                column: "YayinEvi_Id");

            migrationBuilder.AddForeignKey(
                name: "FK_tb_Kitap_tb_YayinEvi_YayinEvi_Id",
                table: "tb_Kitap",
                column: "YayinEvi_Id",
                principalTable: "tb_YayinEvi",
                principalColumn: "YayinEvi_Id",
                onDelete: ReferentialAction.Cascade);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_tb_YayinEvi_YayinEvi_Id",
                table: "tb_Kitap");

            migrationBuilder.DropIndex(
                name: "IX_tb_Kitap_YayinEvi_Id",
                table: "tb_Kitap");

            migrationBuilder.DropColumn(
                name: "YayinEvi_Id",
                table: "tb_Kitap");
        }
    }
}

Buradan sonra package manager console’da update-database yazıyor 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