Foreign Key ve DatabaseGenerated Kullanımı

En son birkaç tane daha model class eklemiştik. Şimdi Data Annotationsları tanımaya devam edelim. Bir attribute’dan daha bahsetmek istiyorum.

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

DatabaseGenerated: Veritabanı tarafından herhangi bir özellik için değerlerin nasıl oluşturulması gerektiğini niteleyen bir attribute’dür. 3 çeşit kullanıma sahip bunlar;

  • Identity : Bu seçenek ile birlikte kullanıldığında kolona ait olan değer sadece database tarafından veri ilk eklendikten sonra başlar demektir. Sıralı artan bir değer değil yani. EF Core burada bir değer türetmez. Database sağlayıcıları arasında değer türetme hususunda farklılıklar görülebilmektedir. GUID gibi bir değer türetilir.
  • None : Bu ise Identity mantığının tam tersi kolona ait değerlerin otomatik olarak oluşturulmasını engelleyen bir seçenektir.
  • Computed : Bu seçenekte değerin ilk kaydedildiğinde veritabanı tarafından oluşturulacağını ve daha sonra her veri güncellemesinde de değerin yeniden oluşturulacağını belirtmektedir.

Kullanımına ilişkin örnek yaparsak:

Identity seçeneği:

Data Annotation kullanımı: [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Fluent Api için kullanım: ValueGeneratedOnAdd

None seçeneği:

Data Annotation kullanımı: [DatabaseGenerated(DatabaseGeneratedOption.None)]

Fluent Api için kullanım: ValueGeneratedNever

Computed seçeneği:

Data Annotation kullanımı: [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

Fluent Api için kullanım: ValueGeneratedOnAddOrUpdate

Ben bunları pek kullanmıyorum bilig verme mahiyetinde değinmek istedim. Gelelim bu dersin asıl önemli konusu Foreign Key konusuna.

Foreign Key Nedir?

Foreign Key, ilişkisel veri tabanı tasarımında bir başka tablo ile ilişkilendirilecek olan tablonun diğer tabloda bir nevi kısıtlanmasıdır. İlişkilendirilecek olan tablonun Primary key alanı ile diğer tablonun Foreign key alanı birbiri ile bağlanır.

EF Core’da Foreign Key tanımlamak oldukça basittir. Biz örnek olarak Kitap classı içinde Kategori classından bir obje oluşturduğumuzda, Kitap classı içinde Kategori classından oluşturmuş olduğumuz nesneyi, objecti yani foreign key olarak tanımlamış oluruz.

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 Kitap
    {
        [Key]         

        public int Kitap_Id { get; set; }

        [Required]
        public string KitapAdi { get; set; }

        [Required]
        public double Fiyat  { get; set; }

        [Required]
        [MaxLength(13)]
        public string ISBN { get; set; }

        [ForeignKey("Kategori")]
        public int KategoriId { get; set; }

        public Kategori Kategori { get; set; }


    }
}


Add-migration EkleIlıskiKitapveKategori diyorum ve migration ekliyorum. 
using Microsoft.EntityFrameworkCore.Migrations;

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

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

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

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

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

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

Akabinde update-database diyerek veritabanına değişiklikleri 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