KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Yorum bırakın


Geliştirmiş olduğunuz programlarınıza ait veri tabanlarında mutlaka aşağıdaki diyagramdaki gibi bir yapı geliştirmiş veya karşılaşmışsınızdır. Burada tablo isimleri veya aralarındaki bağlantı değil. Tablolarda bulunan ortak kolonları gözden kaçırmamanızı istiyorum. Basit olarak iki adet ortak kolonu 3 farklı tabloya ekledim. Bu kolonlar “lud(last updated date – son güncellenme tarihi)” ve “cdate(create date – oluşturulma tarihi)” isimli kolonlardır. Tabii ki ben konuyu anlatmak için sadece bu iki kolonu ekledim.

Normalde; LastModifiedBy(Son güncelleyen) , LastModifiedAt(Son güncelleme tarihi), CreatedBy(Oluşturan) ve CreatedAt(oluşturulma tarihi) şeklinde 4 adet kolonu barındırması daha doğru olacaktır.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

 

Basit bir form üzerinden örneğimizi yapalım.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Ekranda gördüğünüz 3 listbox’a veri tabanındaki uygun verileri dolduruyorum. Listbox’ların üstündeki GroupBox başlıklarından hangisine hangi verinin dolduğunu anlayabilirsiniz. Tabii burada Telefon Numaraları isimli listbox’ın verisi Kişiler isimli listbox’dan seçilen kişi olduğunda doluyor. Her listbox’ın üstünde bulunan “Yeni” ikonu ile yeni kayıt ekleme işlemini, “Kaydet” ikonu ile de kayıtları güncelleme işlemini ilgili tabloya yapıyorum.

Buradaki amaç yeni kayıt ekleme ve güncelleme işlemlerinde ortak olan kolonları(lud ve cdate) otomatik olarak yazacağımız merkezi bir kod ile güncelleme, sürekli olarak işlem yapılan tablolarda bu kolonları işlemek içinde kod yazmak çok mantıklı değil.. Fakat tabii ki özel işlemler söz konusu ise yazılabilir.

Örnek veri tabanı script’ini yazının sonunda bulabilirsiniz. Sql script’i veri tabanınızda çalıştırdığınızda veri tabanı, tabloları ve örnek veriler yüklenecektir. Ardından bir windows form application (C#) projesi açarak yukarıdaki görünümde bir form tasarlayabilirsiniz.

Projenize ADO.NET Entity Data Model ekleyerek veri tabanına bağlanıp gerekli tabloları seçiniz. Ben isim olarak “TestDbModel” verdim.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

Bu işleminde ardından form’un arkasına yazacağımız kodlar şu şekildedir.

public partial class Form1 : Form
{
    private TestDbEntities Entity = new TestDbEntities();
    private Random Rnd = new Random();

    public Form1()
    {
        InitializeComponent();

        this.btnNewKisi.Click += btnNewKisi_Click;
        this.btnSaveKisi.Click += btnSaveKisi_Click;
        this.btnNewTelNo.Click += btnNewTelNo_Click;
        this.btnSaveTelNo.Click += btnSaveTelNo_Click;
        this.btnNewNot.Click += btnNewNot_Click;
        this.btnSaveNot.Click += btnSaveNot_Click;
        this.lstKisiler.SelectedIndexChanged += lstKisiler_SelectedIndexChanged;

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.LoadKullanicilar();
        this.LoadNotlar();
    }

    private void btnNewKisi_Click(object sender, EventArgs e)
    {
        // Yeni kullanıcı kayıdı veritabanına yapılır.
        int kno = this.lstKisiler.Items.Count + 1;

        Kullanici k = new Kullanici();
        k.ad = "Kullanıcı-" + kno.ToString();
        k.soyad = "Kullanıcı-" + kno.ToString();

        // Dikkat ederseniz burada lud ve cdate kolonlarına 
        // bir veri yazma işlemi yoktur.

        this.Entity.Kullanici.Add(k);
        this.Entity.SaveChanges();

        this.LoadKullanicilar();
    }

    private void btnSaveKisi_Click(object sender, EventArgs e)
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            // Eğer kullanıcı seçilmiş ise ad ve soyadı sonuna x yazılır.
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            k.ad += "x";
            k.soyad += "y";

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadKullanicilar();
        }
    }

    private void btnNewTelNo_Click(object sender, EventArgs e)
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            // Eğer kullanıcı seçilmiş ise yeni telefon numarası
            // rastgele oluşturularak eklenir.
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            TelNo t = new TelNo();
            t.KullaniciID = k.id;
            t.TelNo1 = this.Rnd.Next(100, 999).ToString();

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.TelNo.Add(t);
            this.Entity.SaveChanges();

            this.LoadTelNolar();
        }
    }

    private void btnSaveTelNo_Click(object sender, EventArgs e)
    {
        if (this.lstTelNolar.SelectedIndex > -1)
        {
            // Eğer telefon numarası seçilmiş ise seçili numara
            // sonuna "0" eklenerek güncellenir.
            TelNo t = this.lstTelNolar.SelectedItem as TelNo;

            t.TelNo1 += "0";

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadTelNolar();
        }
    }

    private void btnNewNot_Click(object sender, EventArgs e)
    {
        // Yeni bir not oluşturularak kaydedilir.
        Note n = new Note();
        n.NoteVal = this.Rnd.Next(10, 99);

        // Dikkat ederseniz burada lud ve cdate kolonlarına 
        // bir veri yazma işlemi yoktur.

        this.Entity.Note.Add(n);
        this.Entity.SaveChanges();

        this.LoadNotlar();
    }

    private void btnSaveNot_Click(object sender, EventArgs e)
    {
        if (this.lstNotlar.SelectedIndex > -1)
        {
            // Seçili not değeri +/- 3 olarak güncellenir.
            Note n = this.lstNotlar.SelectedItem as Note;

            if (n.NoteVal < 98)
                n.NoteVal += 3;
            else
                n.NoteVal -= 3;

            // Dikkat ederseniz burada lud ve cdate kolonlarına 
            // bir veri yazma işlemi yoktur.

            this.Entity.SaveChanges();
            this.LoadNotlar();
        }
    }

    private void lstKisiler_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.LoadTelNolar();
    }



    private void LoadNotlar()
    {
        this.lstNotlar.DisplayMember = "NoteVal";
        this.lstNotlar.ValueMember = "ID";
        this.lstNotlar.DataSource = Entity.Note.ToList();
    }

    private void LoadKullanicilar()
    {
        this.lstKisiler.DisplayMember = "ad";
        this.lstKisiler.ValueMember = "id";
        this.lstKisiler.DataSource = Entity.Kullanici.ToList();
    }

    private void LoadTelNolar()
    {
        if (this.lstKisiler.SelectedIndex > -1)
        {
            Kullanici k = this.lstKisiler.SelectedItem as Kullanici;

            this.lstTelNolar.DisplayMember = "TelNo1";
            this.lstTelNolar.ValueMember = "ID";
            this.lstTelNolar.DataSource = Entity.TelNo.Where(x => x.KullaniciID == k.id).ToList();
        }
    }
}

Peki en önemli kısma geldik. EF ‘ün “SaveChanges“ metodu çalıştırıldığında yeni eklenmiş entity nesnelerinde ve Güncelleme yapılan entity nesnelerinde gerekli kolonları işlemeliyiz. Tablo ayrımı olmadan..! Kodlar üzerinde gerekli açıklamaları yaptım ama burada da kısaca değinmek istiyorum.

TestDbEntities” class’ımız bir partial class olduğu için aynı isimli ve partial ifadesi geçen bir class oluşturuyoruz. Böylece aslında “TestDbEntities” class’ının devamını yazmaya başlamış oluyoruz. Ardından “SaveChanges” metodunu “Override” ederek eziyoruz ve save işlemi öncesine kendi kodlarımızı yazıyoruz. Bu kodlarda insert ve update edilecek entity nesnelerini elde edip, insert edilecekler de “cdate” kolonunu ve “lud” kolonunu, update edilecek entity nesnelerinde ise sadece “lud” kolonunu işleyecek şekilde kodlarımızı yazıyoruz. Farklı iki şekilde yazdım. İki şekilde de uygundur hangisi kolayınıza geliyorsa onu kullanabilirsiniz.

public partial class TestDbEntities
{
    public override int SaveChanges()
    {
        // Added(insert edilecekler) ve Modified(update edilecekler) elde edilir.
        List<DbEntityEntry> changesList =
            this.ChangeTracker.Entries().Where(
            x => x.State == System.Data.Entity.EntityState.Added ||
                x.State == System.Data.Entity.EntityState.Modified).ToList();

        foreach (DbEntityEntry entry in changesList)
        {
            // Eğer insert edilecek ise cdate özelliği de yazılır.
            if (entry.State == System.Data.Entity.EntityState.Added)
            {
                // 1. yol : entry.CurrentValues özelliği ise işlem yapma..
                if (entry.CurrentValues["cdate"] != null)
                    entry.CurrentValues["cdate"] = DateTime.Now;
            }

            // ister update ister insert olsun lud yazılır.
            // 2. yol : entry.Property özelliği ise işlem yapma..
            if (entry.Property("lud") != null)
                entry.Property("lud").CurrentValue = DateTime.Now;
        }

        // Savechanges metodumuz kaldığı yerden devam ediyor.
        return base.SaveChanges();
    }
}

Görüldüğü üzere gerekli “lud” ve “cdate” verileri yazılmış. Yeni veriler eklenmiş ve güncellenecek olanlar güncellenmiştir.

Entity Framework 6.0 ile Veri tabanı Tablolarındaki Ortak Kolonları Güncelleme

 

Proje dosyaları için tıklayınız..

Reklamlar

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s