Entity Framework'te Code First Tablolar Arası İlişki Kurmak (Mapping)

Entity Framework ile Class yapısı ile tabloları, Property'ler ile kolonları oluşturmuştuk. İlişkisel bir veritabanının olmazsa olmazlarından class ilişkilendirmelerini de kodla yapabiliriz.

Veritabanı ilişki türleri olarak
  • One to One - Bir'e Bir İlişki
  • Many to Many - Çok'a Çok İlişki
  • One to Many - Bir'e Çok İlişki  
türleri bulunur. 

Code First'te tabloları ifade eden Class'ın içerisine property olarak tanımlayabiliriz. Bu işleme Mapping(Bağlama) denir.

Örneğimizde Yazar ile Makale arasında bir ilişki kurmaya çalışalım.Kurgumuzda Yazar ile Makale arasında Bir'e Çok ilişki vardır.

Yazar Tablosu

 public class Yazar
    {
        [Key]
        public int YazarID { get; set; }

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

        [Required]
        public string YazarSoyadi { get; set; }      
        
        public List<Makale> Makaleler { get; set; } 
         
    }

Bir Yazarın birden çok Makalesi olabilir bu yüzden modelde navigation özelliği olan Makaleler ile bir yazara ait olan makaleleri alabiliriz. Makale türünden bir List property'si oluşturmamızın amacı o yazara ait bir ya da birden çok makaleyi almak.

Makale Tablosu


    public class Makale
    {
        [Key]
        public int MakaleID { get; set; }
        
        [Display(Name ="Makale Başlığı")]
        [StringLength(25,ErrorMessage ="En fazla 25 karakter olabilir",MinimumLength =3)]
        [Required(ErrorMessage ="Makalenin başlığını giriniz")]
        public string MakaleBaslik { get; set; }

        [Display(Name ="İçerik")]
        public string MakaleIcerik { get; set; }

        public int YazarID { get; set; }

        public Yazar Yazar { get; set; } 
    }

Bir Makale yalnızca bir Yazara ait olabilir bu yüzden navigation özelliğine Yazar adı verdiğimiz property oluşturduk.Yazar türünden bir property oluşturmamızın amacı makalenin ait olduğu yazarı almaktır. Makale tablosundaki YazarID kolonundan ilişkiyi anlayabilirsiniz. Yazar class'ını primary key propertysi olan bu kolon Makale tablosunda foreign key olarak temsil edilecektir bu yüzden bu tabloda property olarak tanımlanmıştır.

İlişkileri tanımlarken bu mapping işlemlerini yapmak zorundayız.  Çoka Çok bir ilişkide iki tabloda da List property tanımlanmalıdır. Örnek olarak

Bir e-ticaret sitesi için Müşteri, Kategori ve Ürün adında üç class oluşturalım. Kurgumuzda bir Müşteri birden çok ürün satın alabilirken, bir Ürünün ise birden çok müşterisi olabilir.

Müşteri Tablosu


    [Table("Musteri")]
    public class Musteri
    {
        public int MusteriID { get; set; }

        public string MusteriAdi { get; set; }

        public string MusteriSoyadi { get; set; }

        public List<Urunler> MusteriUrun { get; set; }
    }

Bir Müşteri'nin birden çok Ürünü olabilir. Bu ilişkiyi Urunler türünden bir List property'si ile tanımladık.

Ürün Tablosu


  [Table("Urunler")]
    public class Urunler
    {
        [Key]
        public int UrunID { get; set; }

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

        [Required]
        public int KategoriID { get; set; }

        public Kategoriler Kategori { get; set; }
        public List<Musteri> UrunMusteri { get; set; } 
    }

Bir Ürünün yalnız bir Kategorisi olabilir bu yüzden Kategoriler türünden Kategori adını verdiğimiz bir property ile bu ilişkiyi oluşturduk.

Bir Ürünün birden çok Müşterisi olabilir bu yüzden UrunMusteri adında Musteri türünden bir List property'si oluşturduk.

Kategori Tablsosu


  [Table("Kategori")]
    public class Kategoriler
    {
        [Key]
        public int KategoriID { get; set; }

        [Required]
        [Display(Name ="Kategori Adı")]
        [StringLength(25,ErrorMessage ="Kategori adı en fazla 25 karakter olabilir")]
        public string  KategoriAdi { get; set; }

        public List<Urunler> KategoriUrun { get; set; }
    }

Bir kategori birden çok ürün barındırabilir bu yüzden Urunler türünden bir List propertysi oluşturup KategoriUrun adını verdiğimiz ilşkiyi oluşturduk.

Çok'a çok ilişki meselesine gelince;

Oluşturduğumuz olduğumuz bu üç tablo içerisinden Musteri ve Urunler arasında çok'a çok bir ilişki vardır.Yani bir ürün birden çok müşteri tarafından satın alınabilirken, bir müşteri birden fazla ürün satın alabilir.

İki tabloda da birbirlerinin türünden List property'si oluşturduk. Musteri class'ında Urunler türünden, Urunler class'ında ise Musteri türünden bir List oluşturduk. Veri tabanı ile bağlantısı sağlandığında çok'a çok ilişkiler için oluşturulan ara tablo mantığını kodla oluşturmuş oluyoruz.



Tablolarımız SQL Server'da yansımış oldu. MusteriUrunlers adında ara tablomuz da çoka çok ilişki sonucunda otomatik olarak oluşmuştur.





Yorumlar

  1. Hocam merhaba,
    Kodlama sırasında ara tablo olarak oluşturduğumuz MusteriUrunler tablosuna nasıl veri ekleyeceğiz?

    YanıtlaSil
    Yanıtlar
    1. Merhaba,

      Önce müşteri nesnesi oluşturduktan sonra
      Müşteri nesnesindeki ürünler listesine ürün girerek kayıt işlemi gerçekleştirebilir. Bunu sağlayan müşteri sınıfındaki ürünler listesidir.

      Araştırmalarıma göre aşağıdaki gibi yapılabilir.

      var musteriNesnesi= new Musteri { MusteriID = 1, MusteriAdi ="Mert",
      MusteriSoyadi="Metin" };
      Urunler urun1= context.Urunler.FirstOrDefault(s => s.Name == "Alice");
      Urunler urun2 = context.Urunler.FirstOrDefault(s => s.Name == "Bob");

      musteriNesnesi.Students.Add((new Urunler{ Name = "Kitap" });
      musteriNesnesi.Students.Add(new Urunler{ Name = "Top" }););

      context.AddToClasses(musteriNesnesi);
      context.SaveChanges();

      Sil

Yorum Gönder