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


Yorum bırakın

ASP.NET MVC ile Bootstrap Checkbox ve Radio Kullanımı

Evet.. Uzun bir aradan sonra tekrar makale yazmaya başlamalıyım diye düşünüyordum. Sonunda yavaştan yavaştan başlamak gerektiği için hadi bakalım dedim ve kolları sıvadım. Aslında bunun sebeplerinden biri artık çoğu kişinin video içeriklere yönelmesi ve video ile bazı şeyleri göstererek daha hızlı ve 1 dakikalık bir zaman dilimine daha çok şey sığdırabildiğimizden dolayıdır sanırım. Fakat açıkçası ben hala makalelerden ve kitaplardan yanayım. Video içerikler daha kolay uçuyor akıllardan ve özümsemesi zor. Anlatılan bir noktayı bulması da daha zor. Henüz video içi arama pek gelişmedi. Sanırım bu gelince bende ona daha fazla yönelebilirim. Tabii ki izlemek, anlatılanı yapılırken görmek ayrı, olmazsa olmaz. Ama nedense benim gözlerim metin arıyor, ne diyebilirim.

Peki konumuza dönelim. Bu yazımızda sizlere asp.net mvc içinde radio ve checkbox kullanımı ile ilgili bir yöntem göstereceğim. Bende herkes gibi projelerimde veya örneklerimde bootstrap kullanıyorum. Dolayısı ile en çok sıkıntı duyduğum nokta checkbox ve radio kontrollerinin tasarımının bootstrap’te eksik olması! Aslında eksik değil ama bizim alıştığımızdan farklı olması. Bizim bildiğimiz bu şekilde..

 

image

Bootstrap kullanılsa bile ortaya çıkan radio ve checkbox görünümü.

 

Fakat bootstrap ‘in yaklaşımı ile olması gereken budur.

 

image

Bootstrap in checkbox ve radio yaklaşımı bu şekilde

 

Kullanımı kolay ve özellikle mobil cihazlar için bu tasarım aslında harika oluyor.. Fakat bunu elde etmek için gereken HTML kodu şu şekilde(Bu arada ikonlar tamamen benim uydurmamdır ki onu da nasıl yaptığımı göstereceğim). Örneğin HTML, CSS ve JS kodlarına buradan ulaşabilirsiniz.

Okumaya devam et

Reklamlar


Yorum bırakın

ADOX ile MDB ya da ACCDB Access Database Oluşturma

Geliştirdiğiniz uygulamalarda kullanmak üzere 2010 öncesi access veri tabanı(*.mdb) ya da 2010 ve sonrası access veri tabanı(*.accdb) oluşturma ihtiyacınız olursa, aşağıdaki kodlar ile bir access veri tabanı dosyasının disk üzerinde oluşturulmasını sağlayabilirsiniz. Ayrıca oluşturmuş olduğunuz veri tabanına tablo eklemesini ve basit veri tiplerinin nasıl tanımlandığını inceleyebilirsiniz.

Okumaya devam et


2 Yorum

ASP.NET MVC Yazılımcıların Yükselişi

gorsel

Yeni bir eğitim için kolları sıvamış bulunuyorum. Aslında birçok kişi tarafından sürekli istenen bir eğitimdi. Bende yarattığım fırsatlarda bu eğitimi hazırlamaya karar verdim. Şu an eğitimin tüm videoları tamamlanmamış durumda ama son hızla tamamlamak için fırsat buldukça uğraşıyorum. Umarım ortaya güzel bir eğitim çıkar ve bekleyenleri memnun eder. Şu an yaklaşık 8 saatlik bir video serisi çıkmış durumda ama benim öngörüm bu daha yolun yarısı, eğitimi merak edenler için aşağıda tanıtım videosunu ve link’ini paylaşıyor olacağım. Kendiniz de henüz yayınlanmamış bölümleri gördüğünüzde ne demek istediğimi anlayacaksınız.

Eğitim içeriğinde ASP.NET MVC temellerinden başlayarak tüm konulara değinmeye çalışıyor olacağım. Tasarım işlerini Bootstrap’Dan faydalanarak, veritabanı işlemlerini ise Entity Framework CodeFirst ile yapıyor olacağım. Eğitim sonunda 2 Bonus bölüm ve bir uygulama örneği yapıyor olacağım.

Eğitimi bunlarla sınırlamak istemiyorum. Dolayısı ile zamanla fazladan bölüm ekleme ve yenilikleri yine aynı eğitim üzerinden anlatarak eğitimi genişletmeyi düşünüyorum.

ASP.NET MVC Eğitimi için tıklayınız.

Tüm Eğitimlerim için tıklayınız.

ASP.NET MVC Eğitimi by Kadir Murat Başeren

Eğitim içeriğini aşağıda görebilirsiniz;

  • ASP.NET MVC Giriş
  • Razor Syntax (Sözdizimi)
  • Views
  • Controller & View Arası İletişim
  • Models ve Model Binding
  • Bootstrap Framework ve Helper Metotlar
  • Entity Framework CodeFirst Entegrasyonu
  • Entity Framework CodeFirst ile Veritabanı İşlemleri
  • Auto-Generated Views
  • ActionResult Türleri
  • Action Attributes
  • Routing
  • BundleConfig Yapılandırması
  • Durum Yönetimi
  • Validation
  • Filters
  • Ajax Helper Metodları
  • JQuery ile Ajax İşlemleri
  • Area
  • BONUS : Web Helpers
  • BONUS : Grid.MVC Entegrasyonu
  • Uygulama : MyEvernote Örneği

Gördüğünüz gibi dolu bir içerik sizleri ve benim çekmemi bekliyor. Ben üstesinden gelebileceğimi düşünüyorum. Umarım sizlerede bir faydası dokunur.

Şimdiden iyi seyirler ve başarılı projeler dilerim.

 

Visual Studio ile C# Programlama
ASP.NET MVC ile Grid.MVC Entegrasyonu


Yorum bırakın

Excel Export için ReportModel Yapısı ve Kullanımı

Excel export işlemi için daha öncede yazdığım yazıya buradan ulaşabilirsiniz. Bu yazımda sizlere excel export işleminde kullanabileceğiniz esnek bir ReportModel’den bahsedeceğim. Bu yapıları kullanarak oluşturacağınız bir ReportModel’i excel export işleminde kullanabilirsiniz. Böylece elinizde esnek bir yapı olacaktır. Dilediğiniz şekilde excel tabloları oluşturabilirsiniz.

Verilerinizi veritabanından çektikten sonra Report Model’i oluşturmanız yeterli olacaktır. Excel tablosunda görünmesini istediğiniz özellikleri(property) içeren anonim(anonymous) tipi oluşturmanız yeterlidir.

Öncelikle nasıl kullanıldığını içeren Helper class’ı sizlerele paylaşıyorum. Diğer class’larda yazının ilerleyen kısımların mevcut. Kod aralarında açıklama satırları mevcuttur. Anlaşılacağını umuyorum.

 

MyExcelHelper.cs

using ExcelExportSample.Model;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExcelExportSample
{
    public class MyExcelHelper
    {
        public void WriteToExcel(RDExportReportModel exportReportModel, string path)
        {
            // Excel dosya erişimi için gerekli tanımlar yapılır.
            Microsoft.Office.Interop.Excel.Application xlApp;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            // Başlık(Header) hücrelerin renklenmesi sağlanır.
            xlWorkSheet.Cells["1:1"].Font.Bold = true;
            xlWorkSheet.Cells["1:1"].Font.Color = Color.Red;

            int colIndex = 65;  //A

            // Excel tablo Header'lar yazılır.
            foreach (RDExportReportColumnModel column in exportReportModel.ExportData.Keys)
            {
                string cellIndex = char.ConvertFromUtf32(colIndex);
                string cellHeader = column.ColumnName;

                xlWorkSheet.Cells[string.Concat(cellIndex, 1)].Value = cellHeader;

                if (column.ColumnWidth > 0)
                    xlWorkSheet.Cells[string.Concat(cellIndex, 1)].ColumnWidth = column.ColumnWidth;

                if (!string.IsNullOrEmpty(column.Format))
                    xlWorkSheet.Cells[string.Concat(cellIndex, ":", cellIndex)].NumberFormat = column.Format;

                colIndex++;
            }

            colIndex = 65;  //A

            // Her bir kolon için dönülerek, kolon kolon veriler yazılır.
            foreach (RDExportReportColumnModel column in exportReportModel.ExportData.Keys)
            {
                string cellIndex = char.ConvertFromUtf32(colIndex);
                int rowIndex = 2;

                // Değerler satır satır hücrelere yazılır.
                // Yazma işlemi kolon kolon yapılır.
                // Her kolon satur satır işlenir, sonra diğer kolona geçilir.
                foreach (RDExportReportCellModel cellModel in exportReportModel.ExportData[column])
                {
                    xlWorkSheet.Cells[string.Concat(cellIndex, rowIndex)].Value = cellModel.Value.ToString();
                    rowIndex++;
                }

                colIndex++;
            }

            // Excel dosya kaydedilir.
            xlWorkBook.SaveAs(path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
        }

        public void SaveSampleExcelExportFile()
        {
            RDExportReportModel reportModel = new RDExportReportModel();
            reportModel.ExportData = new Dictionary>();

            // Örnek veri bu veri veritabanından geliyor olsun.
            var sampleData = new List>() {
                new Tuple("Murat","Başeren"),
                new Tuple("Şükran","Başeren"),
                new Tuple("Belinay","Başeren")
            };

            // Veritabanından gelen veriyi istediğimiz bir model'e dönüştürüyoruz.
            var data = (from x in sampleData
                        select new
                         {
                             FirstName = x.Item1,
                             LastName = x.Item2
                         }).ToList();

            // Kolon ve verisi oluşturulur.
            reportModel.ExportData.Add(
                RDExportReportColumnModel.CreateColumnModel("ExportExcel#", "FirstName"),
                new List(
                    data.Select(x =>
                        new RDExportReportCellModel()
                        {
                            Value = x.FirstName
                        })));


            // Kolon ve verisi oluşturulur.
            reportModel.ExportData.Add(
                    RDExportReportColumnModel.CreateColumnModel("ExportExcel#", "LastName"),
                    new List(
                        data.Select(x =>
                            new RDExportReportCellModel()
                            {
                                Value = x.FirstName
                            })));

            // Excel export yapılır.
            WriteToExcel(reportModel, Application.StartupPath + @"\sample.xls");
        }
    }
}

RDExportReportModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcelExportSample.Model
{
    public class RDExportReportModel
    {
        /// 
        /// Verileri kolon ve kolona ait hücre değerleri olarak saklıyoruz. Dolayısı ile satırları elde etmek için aşağıdaki metotlar kullanılır.
        /// 
        public Dictionary<RDExportReportColumnModel, List> ExportData { get; set; }

        /// 
        /// Verilen satır index 'ine ait satır verilerini getirir.
        /// 
        /// 
        /// 
        public RDExportReportRowModel GetRow(int rowIndex)
        {
            RDExportReportRowModel rowModel = new RDExportReportRowModel();
            rowModel.Cells = new List();

            this.ExportData.Values.ToList().ForEach(
                x =>
                {
                    rowModel.Cells.Add(
                        new RDExportReportCellModel()
                        {
                            Value = x[rowIndex].Value
                        });
                });

            return rowModel;
        }

        /// 
        /// Tüm satırları verir.
        /// 
        /// 
        public List GetRows()
        {
            List rows = new List();

            int rowCount = this.ExportData[this.ExportData.Keys.First()].Count;

            for (int i = 0; i < rowCount; i++)
            {
                RDExportReportRowModel rowModel = new RDExportReportRowModel();
                rowModel.Cells = new List(this.ExportData.Keys.Count);

                foreach (RDExportReportColumnModel column in this.ExportData.Keys)
                {
                    rowModel.Cells.Add(
                        new RDExportReportCellModel()
                        {
                            Value = this.ExportData[column][i].Value
                        });
                }

                rows.Add(rowModel);
            }

            return rows;
        }
    }
}

RDExportReportColumnModel.cs


namespace ExcelExportSample.Model
{
    public class RDExportReportColumnModel
    {
        public string ColumnName { get; set; }
        public int ColumnWidth { get; set; }
        public string Format { get; set; }


        /// 
        /// 
        /// 
        /// Localization section.
        /// Localization key. For example; "{0}#{1}"
        /// 
        public static RDExportReportColumnModel CreateColumnModel(string section, string key)
        {
            return new RDExportReportColumnModel() { 
                ColumnName = Localization.Get(section, key) 
            };
        }
    }

    public class Localization
    {
        public static string Get(string section, string key)
        {
            // Burada veritabanından okunan localization eşlemesinin karşılığı elde edilir. Örnek; Login#Username gibi anahtar veritabanından sorgulanır.
            return section + "#" + key;
        }
    }
}

RDExportReportRowModel.cs

using System.Collections.Generic;
using System.Drawing;

namespace ExcelExportSample.Model
{
    public class RDExportReportRowModel
    {
        public List Cells { get; set; }
    }
}

RDExportReportCellModel.cs

namespace ExcelExportSample.Model
{
    public class RDExportReportCellModel
    {
        public object Value { get; set; }
    }
}

Örnek kullanım;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcelExportSample
{
    class Program
    {
        static void Main(string[] args)
        {
            MyExcelHelper myExcelHelper = new MyExcelHelper();
            myExcelHelper.SaveSampleExcelExportFile();
        }

    }
}

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


2 Yorum

Engin Demiroğ ‘ dan Yazılım Prensipleri (SOLID) Eğitimi – ÜCRETSİZ

Her yazılımcının yazacağı her satır kodda aklından çıkarmaması gereken temel prensipleri anlatan.
Engin Demiroğ’dan Temmuz ayı boyunca kayıt olan herkese ÜCRETSİZ – Yazılım Prensipleri (SOLID) Eğitimi Eğitimi yayında.

Her yazılımcının yazacağı her satır kodda aklından çıkarmaması gereken temel prensipleri Engin Demiroğ’ dan dinleyerek öğrenin.

Prensiplerin tamamı gerçek temelli projeler düşünülerek anlatılmış. Bir çok eğitim ve proje için önceden izlenmesi faydalı olacaktır.

Kurs İçeriği:

Introduction And Code Smells
Single Responsibility Principle
Open Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle

Tüm eğitimler için tıklayınız.

(Temmuz ayı boyunca kayıt olan herkese)

Eğitime $40 yerine ömür boyu ÜCRETSİZ kayıt olmak için kupon kodunuz : YAZILIMDEVI

Not: Ücretsiz Eğitim Linkini paylaşmanızı rica ederiz.b


1 Yorum

List Tipinden İki Farklı Şekilde Excel Export

İnternette ararken bulduğum iki farklı kütüphane kullanarak yazılmış, List<T> generic tipinden nesnelerinizi excel ‘e export(aktarma) işleminde kullanabileceğiniz kod parçalarını tek bir class içinde topladım. Sürekli ihtiyaç duyulan bir kod olduğu için sizlerinde kıyıya köşeye bir yerlere atmanızı tavsiye ederim.

Kod parçalarından biri Microsoft.Office.Interop.Excel kütüphanesini kullanarak export işlemi yaparken, diğer kod parçası ise DocumentFormat.OpenXml kütüphanesini kullanarak export işlemini gerçekleştiriyor. Örnek bir nesne instance’ı ile denediğimde başarılı ve aynı sonucu aldım. Kod parçaları güzel bir şekilde çalışıyor. List<T> generic tipinde kullandığınız T tipine ait özellikleri kolon olarak ayarlıyor. Sonrasında metoda parametre geçtiğiniz List<T> nesnenizde dönerek, her bir nesneden bir tablo satırı elde ederek excel tablosu şeklinde bir çıktı elde ediyor.

Projenize eklemeniz gereken referansları kod içinde belirttim. Kodları bir class içine koyduktan sonra kullanmak için;

bool result = false;

// Interop.Excel yöntemi ile..
MyHelpers.ExportHelper eh = new MyHelpers.ExportHelper();
result = eh.ExportExcel(fileName, list);

// OpenXml yöntemi ile
result = MyHelpers.ExportHandle.CreateExcelDocument(list, fileName);

Kaynak : http://www.mikesknowledgebase.com

Okumaya devam et


Yorum bırakın

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

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..