27 Nisan 2014 Pazar

Lazy Loading


   Merhaba arkadaşlar,

   Bu hafta birlikte Lazy Loading konusunu öğrenmeye çalışacağız. Lazy Loading kavramının ne olduğunu, Entity Framework konusundaki yerini örneklerle açıklamaya çalışacağım. İlk önce Lazy Loading kavramını açıklayalım. Lazy Loading genel anlamıyla bir nesnenin ihtiyaç duyulmaması halinde çağrılmaması esasına dayanmaktadır. Genel bir örnekle pekiştirirsek bir Web sitesi hayal edelim. Bu web sitesi barındırdığı bütün resimler yüklenmeden açılır. Biz sayfanın ilgili bölümlerini görüntülemeye başladığımızda yine o ilgili bölümde bulunan resimler yüklenmeye başlar. Yani resimleri görüntülemek istediğimiz zaman görüntülenmesi sağlanır. Bu da bize Web sayfasını ilk açmaya çalıştığımızda önemli bir performans katkısı sağlamış olur. Lazy Loading'in temel amacıda budur aslında.

   Lazy Loading'in Entity Framework ile kullanılma amacıda tamamen yukarıda bahsettiğim örnek ile aynıdır. Veritabanımızdaki tabloları nesneler üzerinden kontrol edebildiğimizi daha önceden öğrenmiştik. Oluşturduğumuz nesneleri ihtiyacımız olmadığı zamanlar kullanmazsak bir performans artışı sağlayacağımız şüphesiz. Peki Entity Framework yapısıyla Lazy Loading'i nasıl kullanabiliriz şimdi bunu görelim. Bunun için ilk önce bir veritabanımıza ihtiyacımız var. Örnekleri çeşitlendirmek amacıyla her yazımda farklı bir veritabanı kullanıyorum. Bu yazımda da Northwind veritabanını kullanacağım. Bunun için .bak uzantılı dosyayı buradan indirebilirsiniz. İlgili dosyayı indirdikten sonra .bak uzantılı dosyamızı MS Sql 2008 ile bağlamamız gerekiyor. Bunun için aşağıdaki adımları izlememiz gerekecek.

   Adım 1- İndirdiğimiz dosyayı C:\ klasörüne kopyalayalım.
 
   Adım 2- MS Sql 2008 de Database seçeneğine sağ tıklayıp "Restore Database..." kısmını seçelim.

Figür 1- Restore Database...

   Adım 3- Karşımıza çıkan ekrandan Device kısmını işaretleyip bilgisayarımızda bulunan Northwind veritabanını seçmek için "..." kısmına tıklıyoruz. Bu işlemleri yaptıktan sonra yeni bir pencere açılacaktır. Açılan pencereden Add butonuna basalım.

Figür 2- Veritabanı Ekleme

   Adım 4- Açılan yeni pencereden C:\ klasörüne attığımız Northwind.bak dosyamızı seçip "OK" tuşuna basıyoruz ve veritabanımızı MS Sql 2008'e eklemiş oluyoruz

Figür 3- C:\ Klasöründen Veritabanı Seçme

   Veritabanımızı ekledikten sonra şimdi gelelim örnek kodumuza. Öncelikle C# console application projesi oluşturalım. Oluşturduğumuz projeye her zaman ki gibi DataModel ekliyoruz ve kodlamaya başlıyoruz.

        class Categories
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
        public string Image { get; set; }   
   }

   Category classımızı oluşturduk ve propertyleri tanımladık. Şimdi Product classımızı oluşturalım.

          class Product
     {
        public int ProductID{ get; set; }
        public string ProductName { get; set; }
       public int CategoryID { get; set; }   
     }

   Kullanacağımız attributeler için propertyleri oluşturduk.

   
         NORTHWINDEntities db = new NORTHWINDEntities();

     List<Categories> categories = db.Categories.OrderBy(c => c.CategoryName).ToList();

       
        foreach (Categories cat in categories)
                {

                    Console.WriteLine(string.Format("{0} [{1}]",
                                               cat.CategoryName,
                                               cat.Products.Count));
                    WriteProducts(cat);

                }
       static void WriteProducts(Categories category)

        {
            foreach (Products prod in category.Products)

            {

                Console.WriteLine(string.Format("\t{0}",prod.ProductName));

            }

        }
  
   Bu kodun ekran çıktısı aşağıdaki gibi olacaktır.
Figür 4- Ekran Çıktısı

   Örneğimizde Category tablosundaki tüm Categoryleri CategoryName attributesine göre sıralayarak bir list oluşturuyoruz. Artık elimizde tüm Categoryler var. Şimdi Products tablosundan da verileri getirip getirmediğini deneyebiliriz. Bunun için "foreach" ile her bir Category altındaki Product elemanlarını almaya çalışalım. Bunun için de "WriteProducts" metodunu oluşturup parametre olarak Categories olarak gönderdik ve bu metodun dönüşünde Category'yi gönderip altındaki Product elemanlarını  Console  yazdırdık.

   Sql Profiler dan arka planda çalıştırılan Sql sorgularını incelediğimizde foreach döngüsüne gelene ve Product elemanları çekilmek istenene kadar sadece tüm kategorileri getiren bir sorgu çalıştığını göreceğiz.

   Ne zamanki ürünler isteniyor o zaman Products koleksiyonu dolduruluyor.

   SELECT
   [Extent1].[CategoryID] AS [CategoryID],
   [Extent1].[CategoryName] AS [CategoryName],
   [Extent1].[Description] AS [Description],
   [Extent1].[Picture] AS [Picture]
   FROM [dbo].[Categories] AS [Extent1]

   ORDER BY [Extent1].[CategoryName] ASC

   Şimdi de kodumuzda Lazy Loading'i kapatalım ve sonuçları gözlemleyelim.

   static void Main(string[] args)
        {

            using (NorthwindEntities db = new NorthwindEntities())

            {
                db.ContextOptions.LazyLoadingEnabled = false; 
                List<Categories> categories = db.Categories.OrderBy(c => c.CategoryName).ToList(); 

                foreach (Categories cat in categories)
                {

                    Console.WriteLine(string.Format("{0} [{1}]",
                                                    cat.CategoryName,
                                                    cat.Products.Count));
                    WriteProducts(cat);

                }

            }
        }

        static void WriteProducts(Categories category)

        {
            foreach (Products prod in category.Products)

            {

                Console.WriteLine(string.Format("\t{0}",prod.ProductName));

            }

        }ORDER BY [Extent1].[CategoryName] ASC

   Entity Modellimizin ContexOptions.LazyLoadingEnabled özelliğini false olarak belirledik. ContexOptions.LazyLoadingEnabled ne için kullanıldığını öğrenmek için Visual Studio'ya sorduğumuzda bize aşağıdaki gibi cevap verecektir.


   Şimdi yapmış olduğumuz örneği açıklayacak olursak; Category elemanlarının altındaki Product propertyleri çağırılacak olursa otomatik olarak yüklenecektir. Ancak Product ile ilgili herhangi bir işlem yapılmadığı zaman veritabanından Product ile ilgili bilgilere erişim yapılmayacaktır.

Figür 5- Ekran Çıktısı-2

   Yukarıda görüldüğü gibi Lazy Loading'i kapattığımız zaman Product bilgilerine erişim olmadı. Lazy Loading'i kapatıp Category başlığı altındaki Tüm Productları listelemek istersek aşağıdaki kodu yazabiliriz.
    
   List<Categories> categories = db.Categories.Include("Products").OrderBy(c => c.CategoryName).ToList();

   Yukarıdaki kod Categoryleri alırken ilgili Productlarıda yüklememizi sağlayacaktır. Sql tarafında da sadece bir sorgu dönecek ve işlemimizi tamamlamış olacağız.

   Fakat Lazy Loading ile bu işlemi yaptığımızda her seferinde bir sorgu dönecek toplam sekiz ayrı Category içinse sekiz farklı sorgu dönecektir. Burada tercih bize kalıyor, eğer tüm kategori ve ürünleri göstermeyeceksek, belirli kategorilerin ürünlerini göstereceksek Lazy Loading kullanmak daha mantıklı.

   Bu haftaki yazımında burada sonuna geliyorum. Haftaya ki yazımda görüşmek üzere...

   Referanslar:

   1- http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
   2- http://www.integralwebsolutions.co.za/Blog/EntryId/905/Entity-Framework-5-Lazy-Eager-Explicit-Loading.aspx

20 Nisan 2014 Pazar

LinQ ile Veritabanı İşlemleri

   Merhaba arkadaşlar,

   Geçen hafta LinQ teknolojisini nasıl kullanacağımızı öğrenmiştik. Bu hafta ise LinQ teknolojisi ile birlikte bazı veritabanı işlemlerini gerçekleştirmeye çalışacağız. İlk haftalarda veritabanı işlemleri için ayrı bir veritabanı kullanmıştık. Bu hafta yapacağım programı daha kolay takip etmeniz açısından daha basit ve anlaşılır bir veritabanı kullanacağım.

  İlk olarak veritabanımızı oluşturarak işe başlayalım. MS Sql'de aşağıdaki Queryi execute edelim.

create database School;

use School;

create table Teacher(
Tid int NOT NULL IDENTITY(1,1) ,
name varchar(50),
surname varchar(50),
title varchar(50),
course varchar(50),
primary key(Tid),
)

   Yukarıdaki Query de bir okul veritabanı oluşturduk ve bu veritabanına teacher tablosu ekledik. Teacher tablosuna bazı attributeler ekledikten sonra primary key olan Tid ' yi otomatik artırması için IDENTITY(1,1) kodunu kullandık. Tablomuzu oluşturduktan sonra bu tabloya aşağıdaki şekilde veriler girelim.

Figür 1: Veritabanı Görünüm

   Veritabanımızı oluşturduktan sonra geçmiş haftalarda gösterdiğim şekilde Data Model oluşturuyoruz ve bu haftaki asıl konumuza geçiyoruz.

   Bu hafta LinQ teknolojisini kullanarak veritabanımızdaki verileri özel kurallara göre listelemeyi ve seçili olan veriyi silme işlemlerini öğreneceğiz. Bunun için ilk olarak bir form dizayn edelim ve bu form üzerinden işlemlerimizi yapalım. Formumuzun dizaynı aşağıdaki gibi olsun.

Figür 2: Form Dizayn

   Şekilde de görüldüğü gibi bir DataGridView, bir TextBox, bir Label ve iki Button kullandık ve isimlerini aşağıdaki gibi düzenledik.

DataGridView = dgvTeacher
TextBox = txtTitle
Tamam  Button = btnOnay
Sil Button = btnSil

   Formumuzu dizayn edip gerekli düzenlemeleri yaptıktan sonra şimdi belli bir kurala göre nasıl listeleme işlemi yapacağız onu görelim.

   İlk önce DataModelini oluşturduğumuz School veritabanını kullanmak için aşağıdaki kod blogunu ekleyelim.

   SchoolEntities se = new SchoolEntities();

   Daha sonra Teacher tablosundaki attributeleri kullanmak için GetTeacher classı açıp bütün attributeler için tek tek property oluşturuyoruz.

   class GetTeacher
    {
        public int Tid { get; set; }
        public string name { get; set; }
        public string surname { get; set; }
        public string title { get; set; }
        public string course { get; set; }
    }
}

Listeleme İşlemi:

   Kuralımız öğretmenlerin ünvanları olsun. Textbox'a yazacağımız ünvana göre DataGridView'da ilgili öğretmenler çıksın. Bunun için Tamam Butonun Click metodunu aşağıdaki gibi düzenleyelim.

    private void btnOnay_Click(object sender, EventArgs e)
        {
            List<GetTeacher> lst_Teacher = new List<GetTeacher>();

            lst_Teacher = (from q in se.Teachers
                           where q.title == txtTitle.Text
                           select new GetTeacher
                           {
                               Tid = q.Tid,
                               name = q.name,
                               title = q.title,
                               surname = q.surname,
                               course = q.course,
                           }).ToList();
            dgvTeacher.DataSource = lst_Teacher;

        }

   Geçen hafta anlattığım LinQ konusunda herhangi bir List<> üzerinden nasıl where, select, from gibi komutların kullanılacağını görmüştük. Yukarıda da GetTeacher classı türünde bir List oluşturduk ve bu list üzerinde where komutu ile bir koşul belirtmiş olduk. where q.title == txtTitle.Text   kodu ile TextBox dan aldığımız veriyi q.title'a eşitleyerek istediğimiz ünvanlı öğretmenlerin listelenmesini sağladık.

   ToList() metodu ise GetTeacher türünde oluşturduğumuz lst_Teacher listesine belirtiğimiz koşulu sağlayan öğretmenleri bu listeye atmamızı sağladı.

   Programımızı Yard.Doç ünvana sahip öğretmenleri sıralamak için kullanalım.

Figür 3: Yard.Doç ünvanlı Öğretmenler

Silme İşlemi:

   Silme işlemlerini yapabilmek için kullandığımız DataGridView propertylerinden Multi Select= false, SelectionMode = FullRowSelect yapıyoruz. Bu işlemi yaptıktan sonra getIndex isimli bir değer belirliyoruz.

   public string getIndex;

   Oluşturduğumuz bu string değeri bizim DataGridView'da seçtiğimiz itemin indexini tutacak ve bizde bu index üzerinden silme işlemimizi gerçekleştireceğiz. Seçili iteminin indexini almak için DataGridView metodlarından olan SelectionChanged kullanıyoruz ve aşağıdaki kodlamayı yapıyoruz. 

private void dataGridView1_SelectionChanged(object sender, DataGridViewCellEventArgs e)
        {
            getIndex = "0";
            getIndex = dgvTeacher.CurrentRow.Cells[0].Value.ToString();
        }

   DataGridView üzerinde seçtiğimiz itemın indexini belirledikten sonra artık silme işlemi için gerekli kodlamayı yapabiliriz. Sil buttonunun DialogResult=OK yapalım ve Click metodunu aşağıdaki gibi düzenleyelim.

  private void btnSil_Click(object sender, EventArgs e)
        {
            int index = Convert.ToInt32(getIndex);
            var p = se.Teachers.Where(q => q.Tid == index);
            DialogResult dialog = MessageBox.Show("Silmek İstediğinize Emin misiniz?","Öğretmen Sil", MessageBoxButtons.OKCancel);
           
            if (dialog == DialogResult.OK) 
            {
                p.ToList().ForEach(q => se.Teachers.Remove(q));
                se.SaveChanges();
            }

        }

   Şimdi isterseniz Tid = 5 olan "Cihan Kaleli" öğretmenini silelim.

Figür 4: Silme İşlemi

   OK tuşuna bastığımız zaman ekran görüntüsü aşağıdaki gibi olması beklenir.

Figür 5: Silme İşlemi Sonu

   Bu hafta LinQ teknolojisinden faydalanarak bazı veritabanı işlemleri gerçekleştirdik. Umarım faydalı bir yazı olmuştur. Gelecek hafta görüşmek dileğiyle...

   Referanslar:

11 Nisan 2014 Cuma

LinQ Nedir?


   Merhaba arkadaşlar,

   Geçen hafta beraber Entity Framework kullanarak temel veritabanı işlemleri nasıl yapıldığını incelemiştik. Bu hafta ise geçen haftalarda değindiğimiz konulardan olan LinQ teknolojisinden bahsedeceğim. Öncelikle LinQ'nin geçmişinden bahsetmek istiyorum.

   LinQ (Language Integrated Query) Türkçe karşılığı ile "Dil ile Bütünleştirilmiş Sorgu"dur. .Net Framework 3.5 ve Visual Studio 2008 ile birlikte piyasaya çıkmış,  bir çok alanda kolaylık ve yenilik sağlamıştır. Sağladığı kolaylıkların başında şüphesiz veriye kolay erişim imkanı ve SQL benzeri tek bir söz dizimi ile farklı tiplerdeki verilerin sorgulanmasını sağlamasıdır. Ayrıca C# ile sorgu yazmak, tip güvenli çalışma, ifadelerin otomatik olarak tamamlanması ve IntelliSense gibi özelliklerle geliştiricinin üretkenliğini artırmayı  da sağlar.
   
   LinQ'yi teknolojisine ait sınıflar ve methodları kullanmak istersek System.Linq kütüphanesini kullanmamız gerekir. Bu kütüphanenin tamamını buradan inceleyebiliriz.

   LinQ teknolojisinin bir çok farklı kullanım alanları bulunmakta. Bunlardan bahsedecek olursak;
  • LINQ to Objects: Bellek üzerindeki nesnelerden oluşan koleksiyonları sorgulamak için kullanılır.  
  • LINQ to SQL: SQL Server veritabanlarındaki tabloları sorgulamak için kullanılır. 
  • LINQ to DataSets :ADO.NET DataSet tiplerini sorgulamak için kullanılır.
  • LINQ to XML: Xml verilerini sorgulamak için kullanılır.
  • LINQ to Entity: ADO.NET Entity Framework tarafından oluşturulan varlıkları sorgulamak için kullanılır.
   LinQ geçmişini ve kullanıldığı alanlara göz attıktan sonra bu kavrama biraz daha aşina olduk. Şimdi isterseniz birazda yapısını inceleyelim.

Figür 1: LinQ Yapısı

   Yukarıdaki şekil LinQ yapısının şematik gösterimidir. Dilerseniz bir örnek üzerinden de yapısını ve kullanım şeklini anlatmaya çalışıyım.

   Elimizde bir öğrenci listesi olsun ve bu liste öğrencilerin ismini ve bölümünü içersin;
      
   List<Ogrenci> ogrenciler = new List<Ogrenci>
        {
                      new Ogrenci{ Adi = "Hürkan", Bolum = "Bil. Muh." },
                      new Ogrenci{ Adi = "Orhan", Bolum = "İşletme" },
                      new Ogrenci{ Adi = "Vedat", Bolum = "İstatistik"
                      new Ogrenci{ Adi = "Murtaza", Bolum = "Bil. Muh."  }
       }; 



   Biz bu listeden bölümü Bil. Muh. olan öğrencileri çekmek istediğimizde for , while , swich-case gibi döngüleri kullanabiliriz. Fakat bu döngüler biraz uğraş gerektirdiği  gibi aynı zamanda karmaşıkta olabilirler. Bu gibi durumlarda LinQ imdadımıza yetişiyor.  

   var birOgrenci = (from ogrenci in ogrenciler
                          where ogrenci.Adi == "Hürkan"
                          select ogrenci);

   Yukarıdaki sorguda Hürkan isimli öğrenci tipinde tek bir değişken dönecektir. LinQ teknolojisi sayesinde istersek bir dizi veya bir liste tipinde de değişken döndürmek mümkün. Bunun için bölümü Bil. Muh. olan öğrencileri döndürelim.

   var bilMuhOgrencileri = 
       (from ogrenci in ogrenciler
       where ogrenci.Bolum == "Bil. Muh."select ogrenci).ToList();

   Bu sorguda sonucunda ise bölümü Bil. Muh. olan bir liste elde etmiş olacağız.

   Bu örneğimizi ilk gördüğümüzde sormamız gereken ilk soru bir List <> yapısında "where, select, from" gibi metotların nasıl kullandık? olmalıdır. Bu metotları kullanmamızı sağlayan System.Linq kütüphanesidir. Bu kütüphaneyi projemize import ettiğimiz zaman yukarıdaki linkte bulunan bütün LinQ metotları kullanabiliriz. 

   Şimdi gelelim ikinci sorumuz olan bu var tipi de nedir acaba? ya. Eğer biz var tipinde bir değişken tanımlarsak bunun anlamı ben değişkeni tanımlarken tipini belirtmek istemiyorum demektir. Konuyu örnek vererek açıklamak gerekirse;

   var a= 10//Bu tanımlamada a değerine 10 atanırken tipide int olarak belirlenir.
  
   Bugünkü yazımda LinQ mimarisinin geçmişinden sağladığı kolaylıklardan ve kullanımından bahsetmeye çalıştım. Umarım faydalı bir yazı olmuştur. Bir sonraki yazımda görüşmek üzere...

Referanslar
1- http://msdn.microsoft.com/en-us/library/vstudio/bb397926.aspx
2- http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
3- http://www.koddunyasi.net/makale_dokuman/sql/linq.pdf

30 Mart 2014 Pazar

Entity Framework Temel Database İşlemleri

   Merhaba Arkadaşlar;

   Bu hafta geçen hafta sözünü ettiğimiz Entity Framework konusunda ekleme arama ve güncelleme işlemlerini yapacağız. Bunun için geçen haftadan gösterdiğimiz şekilde bir DataModel oluşturup bu DataModeller üzerinden işlemlerimizi yürüteceğiz. 

  • Yeni Kayıt Ekleme

   Örneğimizi Windows Form application üzerinden yapmak için yeni bir form oluşturalım. Oluşturduğumuz formu add işlemi için kullanacak olursak aşağıdaki kod bloğunu kendi kodumuza uyarlayıp eklememiz gerekecek.

   Oluşturacağımız forma bir adet TextBox , iki adet DataTimePicker ve bir adet de button koyalım ve idlerini aşağıdaki gibi değiştirelim.

Textbox : txt_AboneAdi
        DateTimePicker1 : dt_Baslangic
        DateTimePicker2 : dt_bitis
        Button : btn_kaydet

Figür 1 : Add Genel Ekran
  Yeni bir kayıt eklerken buttonumuzun Click metodunu aşağıdaki gibi düzenlememiz gerekecek.


 TNM_Abone nesnesine aldığımız kaydı veritabanımıza kaydettik ve veri modelimizi oluştururken eklediğimiz TNM_Abone tablosunu nesne olarak nasıl kullanabileceğimizi bu örnekle göstermiş olduk.

  • Kayıt Güncelleme İşlemleri

   Kayıt güncellemek için ise iki farklı ekrana ihtiyacımız olacak. Bu ekranlardan ilki sistemimizde kayıtlı ve önceden var olan müşterileri gösterecek. Diğer ekran ise asıl güncelleme işleminin yapılacağı ekran olacak. Bu ekranda müşterilerin bilgileri olacak ve değiştirmek istediğimiz müşteri bilgilerini bu ekran üzerinden değiştireceğiz.

   İlk ekran görüntüsü şu şekilde olacak.

Figür 2 : Update Genel Ekran
   Bu ekran üzerinde seçtiğimiz abone ID kodunu diğer ekrana aktarıp, ilgili abone ile işlem yapmak için diğer ekranı kullanacağız.(ID aktarımı işlemini gelecek haftalarda ayrıntısı ile anlatacağım). ID sini aktardığımız abone bilgileri otomatik olarak diğer ekranı dolduracak ve değişiklikler yapıldıktan sonra ise update butonuna basıldığında yapılan değişiklikler sisteme kayıt olacaktır.

Figür 3 : Update Edilecek Abone
   DataGridView'dan alınan ID bu ekrana aktarıldı ve ilgili değişmeler ilgili ID'ye sahip abone kaydı üzerine işlendi.


   Update işlemi tamamlandıktan sonraki görünüm ise şu şekildedir.

Figür 4: Update Sonraki Görünüm
  • Kayıt Arama İşlemleri
   Veritabanımızdaki kayıtlar üzerinde arama yapabilmek için öncelikle kayıtları gösterebilceğimiz bir DataGridView'e ve arama yapacağımız abone bilgilerini girmek içinse bir TextBox'a ihtiyacımız olacak.

   DataGridView : dg_Abone
        TextBox : txtAra

  Arama işlemi ile ilgili kodlamaları yapmadan önce datagridview'e istediğimiz tablo bilgilerini nasıl getireceğimizden bahsetmek istiyorum.  LINQ, Entity Framework ile oluşturulan tüm veritabanı nesneleri için kullanılabilmektedir. LINQ içinde metodlar bulunmaktadır. Datagridview'i istediğimiz bilgilerle doldurmak için kullanacağımız metod ise, foreach döngüsüne giren tüm yapılarda kullanılabilir. Bir örnekle açıklamak istersek:
   
   List<Abone> lst_Abone = new List<Abone>();


   Artık arama işlemiyle ilgili kodlamaları yapabiliriz. TextBox'in TextChanged event özelliğini kullanarak metodumuzu oluşturuyor ve gerekli kodlamaları yapıyoruz. TextChanged event'i ile ilgili daha ayrıntılı bilgiye buradan ulaşabilirsiniz.





Figür 5: Arama Ekranı
   Bu hafta temel örnekler vererek ekleme , güncelleme ve arama işlemlerini yapmaya çalıştık. Gelecek hafta bu hafta biraz bahsettiğimiz LinQ'yi teknolojisi üzerinde duracağız. Daha ayrıntılı bilgilerle LinQ'yi teknolojisini tanımaya çalışacağız. Bu haftaki yazımı burada sonlandırıyorum. 

Takipte kalmanız dileğiyle...

Referanslar:

23 Mart 2014 Pazar

Entity Framework Projesi ve Data Model Oluşturma

   Merhaba arkadaşlar,

   Geçtiğimiz hafta Entity Framework konumuza Entity Framework yapısı ve sağladığı faydalarına değinerek bir giriş yaptık. Bu hafta ise Entity Framework'ü nasıl projelerimizde kullanacağımızı ve yeni bir Data Model oluşturmayı göreceğiz.

   Yeni bir proje ve Data Model oluşturmak için bir veritabanına ihtiyacımız olacak. İsterseniz proje oluşturmadan hazır bir veritabanını Sql Server'a eklemeyi öğrenelim. İlk başta şu linkten AdvantureWorkDW'yi indiriyoruz. İndirme işlemi tamamlandıktan sonra dosyaları "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA"(Bu uzantı farklılık gösterebilir fakat genel itibariyle benzer olacaktır.) uzantısına kopyalıyoruz. Daha sonra Sql Serverdaki Object Explorer kısmında bulunana Databases'a sağ tıklayıp 'Attach' diyoruz. 

Figür 1: Attach Database
   Karşımıza gelen ekranda Add butonuna tıklayıp AdventureWorksDW2012_Data.mdf seçiyoruz. Böylelikle veritabanı ekleme işlemini tamamlıyoruz.

Figür 2: Dosya Seçme

   Veritabanımızı ekledikten sonra şimdi gelelim yeni bir proje oluşturmaya. Visual Studio 2012' de EntityFrameworkDeneme adlı bir proje oluşturalım. Solution Explorer kısmından oluşturduğumuz projeye sağ tıklayıp sırasıyla Add -> New Item dedikten sonra çıkan pencerede sol kısımda bulunan Visual C# items seçeneklerinden 'Data' yı seçiyoruz. 'ADO.NET Entity Data Model' sekmesine tıkladıktan sonra dilersek adını değiştirerek 'Add' butonuna basıyoruz.

Figür 3: Data Model Oluşturma

   Yukarıda anlattığımız işlemi yaptıktan sonra karşımıza iki farklı seçenek bulunan bir ekran çıkacak. Bu seçeneklerden ilki 'Generate from database' diğeri ise 'Empty model'. Generate from database seçeneğini daha önceden hazırlanmış bir veritabanı kullanacaksak ve bu veri için model oluşturacaksak seçiyoruz. Empty model ise önce model oluşturup daha sonra veritabanı işlemleri yapacaksak seçilir. Biz Sql Server'a eklediğimiz veritabanı kullanacağımız için Generate from database seçeneğine tıklayıp bir sonraki adıma geçiyoruz.

Figür4: Model Contents Seçme

   Şimdi gelelim bir sonraki adıma. Data Model Contents' i seçtikten sonra hangi veritabanı kullanacağımızı seçmemiz gerekecek. Bunun için eğer daha önce kullandığımız seçeceksek ilgili bölümde veritabanı ismini seçip ilerleyebiliriz. Fakat ilk kez kullanacağımız bir veritabanı olacaksa bunun için 'New Connection' seçeneğinden istediğimiz veritabanı ile bağlantı kurabiliriz.

Figür 5: Veritabanı ile Bağlantı kurma

   'Next' butonuna bastıktan sonra eğer kullanmak istediğimiz veritabanı projemizde yoksa karşımıza bir uyarı penceresi çıkacaktır. Bu uyarı penceresindeki ibare bizi kullanmak istediğimiz veritabanının seçili projede bulunmadığını ve veritabanını projeye kopyalayıp kurulu bağlantıyı güncellemek isteyip istemediğimizi soracaktır.

Figür 6: Uyarı Ekranı

   Şimdi de geldik objesini oluşturmak istediğimiz tabloları seçmeye. Bunun için 'Next' butonuna bastıktan sonra karşımıza gelen ekrandan 'Tables' bölümünü seçiyoruz. Bağlantısını kurduğumuz veritabanının tablolarına bu bölümden ulaşıyoruz. Data Modelini oluşturmak istediğimiz tabloları tek tek seçip 'Finish' butonuna basıp Data Model oluşturma işlemini bitiriyoruz.

Figür 7: Data Model Oluşturmayı Tamamlama

   Data Model oluşturmayı da tamamladıktan sonra şimdi Visual Studio' da görünüm nasıl olacak bir de ona göz atalım.'Finish' butonuna basınca gelen ekranda modelini oluşturmak istediğimiz tablolar belirecek ve aşağıdaki gibi olacak. 

Figür 8: Son Visual Studio 2012 Görünüm

   Eğer MS SQL' de Data Model oluşturduğumuz tablolarda herhangi bir değişiklik yaparsak bunu Visual Studio'ya bildirmemiz gerekir. Aksi halde yaptığımız değişiklik Visual Studio' da gözükmez. Bu değişiklikleri Visual Studio' ya bildirmek için ilgili tabloya sağ tıklayıp 'Update Model From Database' seçeneğine tıklıyoruz. 'Refresh' kısmına bastıktan sonra güncelleme olan tabloyu seçip 'Finish' butonuna basıyoruz. Artık tablomuz güncel.

Figür 9: Tabloları Güncelleme

   Bütün bu işlemleri yaptıktan sonra Data Model oluşturmayı tamamlamış olduk. Bir sonraki haftada yapılacak olan Ekleme, Silme, Güncelleme işlemleri için hazırız. Bu haftaki yazımı burada tamamlıyorum. Gelecek yazımda görüşmek üzere...

16 Mart 2014 Pazar

Entity Framework'e Giriş

   Merhaba arkadaşlar,

   Birlikte geçireceğimiz 10 haftalık süreçte sizlere Entity Framework yani Varlık Yapıları hakkında bilgi vermeye çalışacağım. Bu süreç boyunca, Entity Framework'ün temel seviyesinden başlayarak ileri düzey seviyedeki konuları inceleyecek, bilgi kütüphanemizi genişletmek için çaba harcayacağız.

   Bu haftaki yazımda kısaca Entity Framework yapısından, sağladığı kolaylıklardan bahsedeceğim. Entity Framework nedir? sorusunu yanıtlamadan önce ORM (Object Relation Mapping ) nedir? sorusunun cevabını aramakla işe başlayalım.

   ORM, ilişkisel veritabanları yönetim sistemleri (Relational Database Management Systems) ile nesne yönelimli programlama (Object Oriented Programming) arasında bir köprü görevi yapan ve veritabanımızda bulunan veriyi yönetmemizi sağlayan bir modelleme tekniğidir. Bu tekniği kullanan araçlara da ORM araçları adı verilir.

   ORM nedir? sorusunun cevapladıktan sonra Entity Framework yapısını açıklayabiliriz. Entity Framework .NET platformunu için geliştirilmiş bir ORM aracıdır. İlk kez .NET 3.5 ve Visual Studio 2008 ile birlikte 2008'in Ağustos ayında piyasaya çıkmıştır. ORM'nin açıklamasından da anlaşılacağı gibi Entity Framework veritabanımızdaki tabloları nesnelere çevirerek uzun ve anlaşılması zor SQL kodları yazmak yerine oluşturulan bu nesneler üzerinden işlemleri yapmamızı sağlar.

   Entity Framework'ün sağladığı kolaylılardan kısaca bahsedecek olursak;

  • Database performansını artırır. EDM (gelecek haftalarda bahsedeceğim.) databasedeki değişiklere bağlı olarak güncellenir. Bu sayede program sürekli databasedeki tablolara ulaşmak yerine EDM üzerinden işlemleri yapacak, bu sayede daha hızlı işlemler gerçekleştirebileceğiz.
  • Entity Framework CRUD (Create, Read, Update, Delete ) işlemlerini gerçekleştirebilir. Bu sayede uzun ve zahmet gerektiren SQL kodları yazmaktan kurtulabiliriz.
  • Entity Framework  Microsoft SQL Sever başta olmak üzere Oracle ürünü olan MySQL de kullanabilir. Fakat işlemlerimizi LinQ (ilerki haftalarda bahsedeceğim bir başka konu.) teknolojisi kullanarak yapacaksak MS SQL Server kullanmak zorundayız.
  • Database'in sıkıntılı konularından olan "1 to 1", "many to many", "many to 1" ilişkileri kolaylıkla yönetmemizi sağlar.
  • İlişkiler(relationships) ile entityler arasında kalıtım(inheritance) yapma imkanı sağlar.
 
   Entity Framework konusunda ilerleyen haftalarda neler bahsedeceğiz şimdi onları görelim.

  1. Entity Framework Projesi ve Data Model Oluşturma
  2. Ekleme, Silme, Güncelleme (Add, Delete, Update) İşlemleri
  3. LinQ nedir?
  4. LinQ ile Veritabanı İşlemleri
  5. Lazy Loading
  6. Entity Framework Kalıtım (Inheritance)
  7. Entity Framework ile Stored Procedure
  8. POCO (Plain and Old CLR Object)
  9. Bugüne Kadar Geçen Süreç Değerlendirmesi ve Sonuç
   Bir sonraki yazımda görüşmek üzere...

   Referanslar