FLUENT API İLE NOT MAPPED VE HAS MAX LENGTH NASIL KULLANILIR?

Bu dersimizde fluent api ile not mapped ve max length attributeleri nasıl kullanılır buna değineceğim ancak öncesinde belirtmem gereken bir husus var.

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

Veritabanımda tablolarım aşağıdaki şekilde mevcut.

Bu tablolara bakıldığında KitapDetay gibi bir tabloyu görebiliyorsunuz. Ayrıca benim geçen ders eklediğim FluentApi_KitapDetaylar tablom da var.

Uygulamama dönüyorum, ApplicationDbContext classıma geldiğimde içinde yer alan DbSet’ler içinde KitapDetay yok. Olanlar aşağıdakiler;

public DbSet< Tur> Turler { get; set; }
        public DbSet< Kitap> Kitaplar { 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; }

Peki bu DbSet’ler içinde yer almamasına rağmen KitapDetay nasıl oldu da eklendi?

Bunun sebebi için Kitap model classımıza gidelim. Kodlarımızı inceleyelim. Burada aşağıdaki şekilde olduğu gibi KitapDetay’ın bir property olarak eklendiğini görebilirsiniz.

public KitapDetay KitapDetay { get; set; }

Buna bağlı olarak EF Core’un çalışma prensibi gereği bu alanın tanımlanmış olma durumunu alır ve daha önceki migrationlarda da kullanıldığı için bu tabloyu veritabanında oluşturur. 

Şimdi ben burada kontrolü ele alıp kendim ApplicationDbContext içine KitapDetay için DbSet eklemek istiyorum. ApplicationDbContext içine geliyor ve DbSet olarak KitapDetay ekliyorum.

public DbSet< KitapDetay> KitapDetaylar { get; set; }

Daha sonra package manager console’da add-migration EkleKitapDetayDBsetDB oluşturuyorum.

Migration içeriğim:

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleKitapDetayDBsetDB : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_KitapDetay_KitapDetay_Id",
                table: "tb_Kitap");

            migrationBuilder.DropPrimaryKey(
                name: "PK_KitapDetay",
                table: "KitapDetay");

            migrationBuilder.RenameTable(
                name: "KitapDetay",
                newName: "KitapDetaylar");

            migrationBuilder.AddPrimaryKey(
                name: "PK_KitapDetaylar",
                table: "KitapDetaylar",
                column: "KitapDetay_Id");

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

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

            migrationBuilder.DropPrimaryKey(
                name: "PK_KitapDetaylar",
                table: "KitapDetaylar");

            migrationBuilder.RenameTable(
                name: "KitapDetaylar",
                newName: "KitapDetay");

            migrationBuilder.AddPrimaryKey(
                name: "PK_KitapDetay",
                table: "KitapDetay",
                column: "KitapDetay_Id");

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

Daha sonra package manager console’da Update-database diyerek güncellemenin db tarafına yansıtılmasını sağlıyorum.

Bu kısmı düzenledikten sonra bu dersin konusuna geri dönelim.

NOT MAPPED VE HAS MAX LENGTH KULLANIMI

Ben FluentApi_KitapDetay tablomda işlemlerimi yapmıştım, diğerlerine devam ediyorum arkadaşlar. Bu esnada da Fluent Api ile attribute’ların nasıl uygulandığını da göreceğiz. İki tanesini yani Primary Key ve Required’ı anlattık zaten.

Şimdi öncelikle Kitap model classıma geliyorum burada ne yaptı isem aynısını FluentApi_Kitap classım içinde yapacağım. Tabi bunları ApplicationDbContext üzerinde yapacağım.

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

Görüleceği üzere burada yeni gördüğümüz HasMaxLength attribute için kullanımı bu şekilde gerçekleştiriyoruz.

Daha sonra Yazar model classıma geliyorum burada ne yaptı isem aynısını FluentApi_Yazar classım içinde yapacağım. Tabi bunları ApplicationDbContext üzerinde yapacağım.

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

Burada da en sonra yer alan Ignore ile NotMapped attirbute’ünü kullanmış oluyoruz.

Daha sonra YayinEvi model classıma geliyorum burada ne yaptı isem aynısını FluentApi_ YayinEvi classım içinde yapacağım. Tabi bunları ApplicationDbContext üzerinde yapacağım.

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

Şimdi bunları yaptık, birde relation kısmını yapalım, yine ApplicationDbContext üzerinde çalışıyorum.

Relation kısmım:

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

ApplicationDbContext classımın tüm kodları:

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

        }
    }
}

FluentApiKitapYazar haricinde hepsi tamam.

Package-manager console ekranıma geliyorum ve add-migration EkleFluentApiModellemesi diyorum. Migration oluşturuluyor. Migration kodlarım:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class EkleFluentApiModellemesi : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(
                name: "FK_KitapYazarlar_tb_Kitap_Kitap_Id",
                table: "KitapYazarlar");

            migrationBuilder.DropForeignKey(
                name: "FK_KitapYazarlar_tb_Yazar_Yazar_Id",
                table: "KitapYazarlar");

            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_KitapDetaylar_KitapDetay_Id",
                table: "tb_Kitap");

            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_tb_Kategori_KategoriId",
                table: "tb_Kitap");

            migrationBuilder.DropForeignKey(
                name: "FK_tb_Kitap_tb_YayinEvi_YayinEvi_Id",
                table: "tb_Kitap");

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

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

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

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

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

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

            migrationBuilder.CreateTable(
                name: "YayinEvleri",
                columns: table => new
                {
                    YayinEvi_Id = table.Column< int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    YayinEviAdi = table.Column< string>(type: "nvarchar(max)", nullable: false),
                    Lokasyon = table.Column< string>(type: "nvarchar(max)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_YayinEvleri", x => x.YayinEvi_Id);
                });

            migrationBuilder.CreateTable(
                name: "Yazarlar",
                columns: table => new
                {
                    Yazar_Id = table.Column< int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    YazarAd = table.Column< string>(type: "nvarchar(max)", nullable: false),
                    YazarSoyad = table.Column< string>(type: "nvarchar(max)", nullable: false),
                    Lokasyon = table.Column< string>(type: "nvarchar(max)", nullable: true),
                    DogumTarihi = table.Column< DateTime>(type: "datetime2", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Yazarlar", x => x.Yazar_Id);
                });

            migrationBuilder.CreateTable(
                name: "Kitaplar",
                columns: table => new
                {
                    Kitap_Id = table.Column< int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    KitapAdi = table.Column< string>(type: "nvarchar(max)", nullable: false),
                    Fiyat = table.Column< double>(type: "float", nullable: false),
                    ISBN = table.Column< string>(type: "nvarchar(13)", maxLength: 13, nullable: false),
                    KategoriId = table.Column< int>(type: "int", nullable: true),
                    KitapDetay_Id = table.Column< int>(type: "int", nullable: false),
                    YayinEvi_Id = table.Column< int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Kitaplar", x => x.Kitap_Id);
                    table.ForeignKey(
                        name: "FK_Kitaplar_KitapDetaylar_KitapDetay_Id",
                        column: x => x.KitapDetay_Id,
                        principalTable: "KitapDetaylar",
                        principalColumn: "KitapDetay_Id",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_Kitaplar_tb_Kategori_KategoriId",
                        column: x => x.KategoriId,
                        principalTable: "tb_Kategori",
                        principalColumn: "KategoriId",
                        onDelete: ReferentialAction.Restrict);
                    table.ForeignKey(
                        name: "FK_Kitaplar_YayinEvleri_YayinEvi_Id",
                        column: x => x.YayinEvi_Id,
                        principalTable: "YayinEvleri",
                        principalColumn: "YayinEvi_Id",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateIndex(
                name: "IX_Kitaplar_KategoriId",
                table: "Kitaplar",
                column: "KategoriId");

            migrationBuilder.CreateIndex(
                name: "IX_Kitaplar_KitapDetay_Id",
                table: "Kitaplar",
                column: "KitapDetay_Id",
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Kitaplar_YayinEvi_Id",
                table: "Kitaplar",
                column: "YayinEvi_Id");

            migrationBuilder.AddForeignKey(
                name: "FK_KitapYazarlar_Kitaplar_Kitap_Id",
                table: "KitapYazarlar",
                column: "Kitap_Id",
                principalTable: "Kitaplar",
                principalColumn: "Kitap_Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_KitapYazarlar_Yazarlar_Yazar_Id",
                table: "KitapYazarlar",
                column: "Yazar_Id",
                principalTable: "Yazarlar",
                principalColumn: "Yazar_Id",
                onDelete: ReferentialAction.Cascade);
        }

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

            migrationBuilder.DropForeignKey(
                name: "FK_KitapYazarlar_Yazarlar_Yazar_Id",
                table: "KitapYazarlar");

            migrationBuilder.DropTable(
                name: "Kitaplar");

            migrationBuilder.DropTable(
                name: "Yazarlar");

            migrationBuilder.DropTable(
                name: "YayinEvleri");

            migrationBuilder.AddColumn< int>(
                name: "KategoriId",
                table: "tb_Kitap",
                type: "int",
                nullable: true);

            migrationBuilder.AddColumn< int>(
                name: "KitapDetay_Id",
                table: "tb_Kitap",
                type: "int",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.AddColumn< int>(
                name: "YayinEvi_Id",
                table: "tb_Kitap",
                type: "int",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.CreateIndex(
                name: "IX_tb_Kitap_KategoriId",
                table: "tb_Kitap",
                column: "KategoriId");

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

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

            migrationBuilder.AddForeignKey(
                name: "FK_KitapYazarlar_tb_Kitap_Kitap_Id",
                table: "KitapYazarlar",
                column: "Kitap_Id",
                principalTable: "tb_Kitap",
                principalColumn: "Kitap_Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_KitapYazarlar_tb_Yazar_Yazar_Id",
                table: "KitapYazarlar",
                column: "Yazar_Id",
                principalTable: "tb_Yazar",
                principalColumn: "Yazar_Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_tb_Kitap_KitapDetaylar_KitapDetay_Id",
                table: "tb_Kitap",
                column: "KitapDetay_Id",
                principalTable: "KitapDetaylar",
                principalColumn: "KitapDetay_Id",
                onDelete: ReferentialAction.Cascade);

            migrationBuilder.AddForeignKey(
                name: "FK_tb_Kitap_tb_Kategori_KategoriId",
                table: "tb_Kitap",
                column: "KategoriId",
                principalTable: "tb_Kategori",
                principalColumn: "KategoriId",
                onDelete: ReferentialAction.Restrict);

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

Pacakage manager console ekranında Update-database diyerek güncelleme işlemini yapıyorum.

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

Bir cevap yazın

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