FLUENT API İLE PRIMARY KEY ve REQUIRED NASIL KULLANILIR?

Bu dersimizde Fluent Api genel tanıtımı ile başlamak istioyrum. Fluent Api veri model konfigürasyonu yapmanın alternatif daha gelişmiş bir yoludur. Bir önceki derste hatta buna ilişkin olarak iki tane primary key kullanma ihtiyacımız olmuştu ve burada composite key naısl oluşturulur diye bunu anlatmıştık. Uygulamalarımızda data annotationsları ve fluent api yaklaşımını birlikte kullanabiliriz. Ancak kodlarda öncelik fluent api yapısınındır. Akabinde data annotations gelir en sonda var sayılan kullanımlar gelir.

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

Şimdi ben uygulamamda fluent api ile ilgili örnekleri yapabilmek için var olan classlardan Yazar, Kitap, KitapYazar, KitapDetay, YayinEvi model claslarımı kopyalıyorum. Bunların ön kısımlarına Fluent_ şeklinde isim verip, her birinin içine girip Data annotationsları, ilişkileri kaldırıyorum ve class adını içerde de düzenliyorum. Çünkü ben fluent_api konularını bunlar üzerinde anlatacağım. Dediğim gibi bu bir proje yapısı kurarken bir zorunluluk değil, bir tercih.. Bazen de bir zorunluluk tıpkı composite key oluşturmak gibi.

Kodlarımız:

FluentApi_Kitap Model Classı Kodlar:

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

        
        

    }
}

FluentApi_KitapDetay Model Classı Kodlar:

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

        
    }
}

FluentApi_KitapYazar Model Classı Kodlar:

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

        
    }
}

FluentApi_YayinEvi Model Classı Kodlar:

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

       

    }
}

FluentApi_Yazar Model Classı Kodlar:

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

       


    }
}

Bu düzenleme işlemlerimizin akabinde en temel iki konu ile başlayalım. Bunlar Required ve Primary Key attibuteleri.

Primary Key kullanmadan herhangi bir modeli veritabanınıza ekleyemezsiniz. Biz daha önce data annotations ile primary key tanımlarken eğer içerisinde ID veya KategoriId gibi bir isimlendirme var ise bu varsayılan bir isimlendirmedir deyip, herhangi bir Key attribute yani data annotations kullanmadan EF Core’un yapısı gereği bunu primary key olarak tanımlar demiştik. Eğer Biz Kategori_Id gibi bir isim verecek isek bu sefer bu property için [Key] attirbute kullanılmalıdır demiştik.

Şimdi fluent api’da böyle bir konuya gerek yok çünkü zaten ben primary key olarak tanımlayacağım alanı HasKey ile belirtmek durumundayım, dolayısı ile içinde Id olmuş veya olmamış önemli değil. Ama zaten clean code mantığı ile bakılırsa olaya Id ibaresini zaten geçireceğim.

ApplicationDbContext classıma geliyorum ve kodlarımı yazıyorum:

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< YayinEvi> YayinEvleri { get; set; }
        public DbSet< Yazar> Yazarlar { get; set; }
        public DbSet< KitapYazar> KitapYazarlar { get; set; }

        public DbSet< FluentApi_KitapDetay> FluentApi_KitapDetaylar { 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();

        }
    }
}

Akabinde database’e push etmek için migration oluşuturuyorum. Package manager console’da add-migration FluentApiKitapDetayPrimary_Required deyip migration oluşturdum.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GRSYKitapEvi_DataAccess.Migrations
{
    public partial class FluentApiKitapDetayPrimary_Required : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "FluentApi_KitapDetaylar",
                columns: table => new
                {
                    KitapDetay_Id = table.Column< int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    BolumSayisi = table.Column< int>(type: "int", nullable: false),
                    KitapSayfasi = table.Column< int>(type: "int", nullable: false),
                    Agirlik = table.Column< double>(type: "float", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_FluentApi_KitapDetaylar", x => x.KitapDetay_Id);
                });
        }

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

Daha sonra package manager console’da update-database diyorum ve değişiklikleri veritabanına yansıtı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