Entity Framework – Code First İle Tabloları İlişkilendirme

Merhaba,

Bir önceki Entity Framework İle Code First Yaklaşımı başlıklı yazımda Entity Framework – Code First yaklaşımına giriş yaparak nasıl veritabanı ve tablo oluşturulduğuna ve bu süreçte nelere dikkat edilmesi gerektiğine detaylıca göz atmıştık. Bu yazımızda ise Code First yapısıyla tablolar arasında Foreign Key ilişkisi kurmayı inceleyeceğiz.

Örneklendirmemi bir okul senaryosu üzerine kuracağım. Okul veritabanı oluşturacak, içerisinde öğretmen ve derslere özel tablolar barındıracağım. İşte gerekli yerlerde senaryoyu düzenleyip ekleme çıkarma yaparsak nedenini yazının akışından yakalayacaksınızdır.

Öncelikle öğretmenler ve derslere özel Entity’lerimizi oluşturalım. Bu entityler veritabanımızda tablo görevi görecek sınıflardır.

    class Ogretmen
    {
        public int OgretmenID { get; set; }
        public string Adi { get; set; }
        public string SoyAdi { get; set; }
    }
    class Ders
    {
        public int DersID { get; set; }
        public string DersAdi { get; set; }
    }

Gördüğünüz gibi öğretmen ve ders tablolarımı nitelendiren sınıfları oluşturmuş oldum.

Şimdi bu tablolar arasında ilişkiyi şu mantıkla kuracağız.

Her öğretmenin bir dersi mevcuttur lakin her dersin birden fazla öğretmeni olabilir.

Olaya bu mantık açısından bakınca öğretmenleri aşağıdaki gibi güncellemeliyiz.

    class Ogretmen
    {
        public int OgretmenID { get; set; }
        public string Adi { get; set; }
        public string SoyAdi { get; set; }
        public int DersID { get; set; }
        public virtual Ders Ders { get; set; }
    }

Gördüğünüz gibi her öğretmenin bir dersi mevcut olduğundan dolayı Ders tipinde bir Ders propertysi, int tipinde de DersID propertysi ekledim.
Aynı mantıkla dersleride aşağıdaki gibi güncellemeliyiz.

    class Ders
    {
        public int DersID { get; set; }
        public string DersAdi { get; set; }
        public virtual List<Ogretmen> Ogretmenler { get; set; }
    }

Madem her bir dersin birden fazla öğretmeni olabilir, bir öğretmenler tipinde liste şeklinde property tuttum.

Şimdi bu yaptığım işlemlerle server arasında bağlantıyı oluşturacak Context’timizi yazalım.

    class OkulDbContext : DbContext
    {
        public DbSet<Ogretmen> Ogretmenler { get; set; }
        public DbSet<Ders> Dersler { get; set; }
    }

Ardından veritabanı oluşturması için server bilgilerimizi config dosyasında oluşturalım.

  <connectionStrings>
    <add name="OkulDbContext" connectionString="Server=.;Database=OkulVeriTabani;Trusted_Connection=true;" providerName="System.Data.SqlClient"/>
  </connectionStrings>

Ve son olarak Context sınıfımızdan bir nesne oluşturup, gerekli veritabanı ve tablolarımızı oluşturalım.

    class Program
    {
        static void Main(string[] args)
        {
            OkulDbContext Veri = new OkulDbContext();
            Veri.Database.Create();
        }
    }

SQL Server’ı incelersek eğer,

Entity Framework - Code First İle Tabloları İlişkilendirme

Entity Framework – Code First İle Tabloları İlişkilendirme


Gördüğünüz gibi veritabanı ve tablolarımız oluşturulmuştur. Bunların yanında tabloların arasındaki ilişkide aşikardır.
Diyagramdan da incelemek gerekirse,
Entity Framework - Code First İle Tabloları İlişkilendirme

Entity Framework – Code First İle Tabloları İlişkilendirme


Gördüğünüz gibi tablolar arasında bu şekilde ilişki kurulmaktadır.

Bir sonraki yazımda görüşmek üzere…
İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

8 Cevaplar

  1. Yasin ilkalp Arabacı dedi ki:

    Merhabalar hocam
    Benim Tablolarımda CreatedUserId ve UpdatedUserId adında iki kolonum var. bunları Users tablosundaki UserId alanlarıyla ilişkilendirmek istiyorum. Kolon isimleri farklı olduğu için database update ederken hata alıyorum.
    Cevabınız için şimdiden Teşekkür ederim.

    • Gençay dedi ki:
      class ATablo
      {
          public string CreatedUserId { get; set; }
          public string UserId { get; set; }
          public Users User { get; set; }
      .
      .
      .
      }
      
      class BTablo
      {
          public string UpdatedUserId { get; set; }
          public string UserId { get; set; }
          public Users User { get; set; }
      .
      .
      .
      }
      
      class Users
      {
          public string UserId { get; set; }
          public virtual List<ATablo> ATablos { get; set; }
          public virtual List<BTablo> BTablos { get; set; }
      .
      .
      .
      }
      

      Bu mantıkta hareket ettiniz mi? Aksi taktirde ilgili sınıfların içeriklerini burada paylaşırsanız yardımcı olabilirim.

  2. Misafir dedi ki:

    Yukarıda yaptığınız classları ben oluşturdum. Ve “datagridview” in source olarak OGRETMENi verdiğimde gridde 4 sütun geliyor. Öğretmenin Adı, soyadı, DersID numarası(bu sütunda sadece rakam var) birde boş olan bir sütun. Oysaki ben Öğretmenin ad,soyaddan sonra DersId değilde DersinAdi gelmesini istiyorum. Ne yapmalıyım. Saygılarımla.

    • Gençay dedi ki:

      Aşağıda olduğu gibi istediğiniz kolonu DataGridView nesnesinden kaldırabilirsiniz.

                  dgv.Columns["DersId"].Visible = false;
      

      Lakin öğretmene özel dersin adını getirebilmeniz için biraz daha yoğun prosedürel çalışmamız gerekecektir.
      Önce DataGridView nesnesindeki her bir satıra döngü aracılığıyla ulaşarak DersId kolonundaki veriyi elde edeceksiniz. Daha sonra derslerde arama yaparak ilgili id ile eşleşen ders nesnesini elde ederek DataGridView’e aşağıdaki gibi bir kolon ekleyecek ve ders adını bu kolona değer olarak atayacaksınız.

                      DataGridViewImageColumn kolon = new DataGridViewImageColumn();
                      kolon.Name = "clnDersAdi";
                      dgv.Columns.Add(kolon);
      

      Uzun lafın kısası bu şekilde çalışmanız işinizi görecektir.
      Kolay gelsin…

  3. Borahan dedi ki:

    Burada mappingleri nasıl ayarlıyoruz. Bu konudada bilgi vermeniz mümkünmü

  4. Mehmet dedi ki:

    Bir alışveriş sitesi kuruyorum. Kullanıcılar ve Urunler var. Kullanıcıların birden fazla ürünü seçmiş olabilir Urunlerde birden fazla kullanıcıya bağlı olabilir bunun için ayrı bir class mı oluşturmalıyım. Sepet adında bir class oluştursam bunu ve diğer class’ları nasıl yazmalıyım.

    • Gençay dedi ki:

      Öncelikle Merhaba Mehmet;

      Yapman gereken mantık çok kolay. Bir tablo oluşturacaksın yani Code First’te çalışacağın için o tabloya karşılık gelen bir sınıf oluşturacaksın.
      O sınıfın tasarımı aşağıdaki gibi olacak.

      KullanıcıIDUrunIDAdet
      115025
      115135
      11525
      215015
      21575
      314725
      41611

      Tüm değerler temsilidir. Buradaki verilerden hangi kullanıcı hangi ürünleri almış ya da bir başka deyişle hangi ürünler hangi kullanıcılar tarafından alınmış görülebilmektedir.

      Kolay gelsin.
      Sevgiler.

  5. Abdulkadir dedi ki:

    Güzel içerik için teşekkür ederim.

Bir cevap yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.