Veysel Uğur KIZMAZ

Entity Framework Code First Nedir? Örnek Proje ile İnceleyelim

25.07.2013Okunma Sayısı: 71247Kategori: Entity Framework

Daha önce Entity Framework Database First yöntemiyle, var olan bir veritabanının modelini oluşturma ve sorgulama yapma işlemlerini incelemiştik. Konuyu tekrar hatırlamak veya göz atmak isteyen arkadaşlar için makale linklerini aşağıda tekrar paylaşıyorum.

Entity Framework kategorisi: http://www.ugurkizmaz.com/YazilimKategori-4-Entity-Framework.aspx

Entity Framework Model oluşturma: http://www.ugurkizmaz.com/YazilimMakale-774-Entity-Framework---Model-Olusturma.aspx

Bu örneğimizde Entity veri modelini Code First yöntemi ile oluşturmayı öğreneceğiz.

Entity Framework’e başladığım dönemlerde Database First yöntemi çok basit, Code First çok karmaşık geliyordu gözüme, bu yüzden çok ilgilenmemiştim açıkçası :) Fakat Code First’ü kullandıkça Entity Framework’ü daha çok sevmeye başladım. Çünkü bu yöntemle tüm kodun (modelin) hakimiyeti sizde oluyor ve istediğiniz gibi kullanabiliyorsunuz. Database First’te ise her şey hazır olarak geldiği için daha çok sürükle-bırak seven ve az kod > çok iş düşüncesindeki arkadalşar tarafından tercih edilmektedir.

Konuyu örnek bir proje üzerinde gerçekleştirelim. Projemizde bir alışveriş sitesindeki ürünler ve ürünlerin bulunduğu kategorileri veritabanına kaydedip sorgulayalım.

1. Visual Studio’da Console Application oluşturalım.

2. NuGet ile EntityFramework paketini projeye ekleyelim.

3. Oluşturduğumuz projeye MagazaContext isimli bir class dosyası ekleyelim.

4. MagazaContext dosyasını açalım ve namespace içerisine kategori ve ürün sınıflarını oluşturalım.

5. Kategori sınıfında KategoriId (int), Ad (string) (scalar) özellikleri yer alsın. Kategorinin içindeki ürünleri alabilmek için List<Urun> tipinde Urunler (navigation) özelliğini de ekleyelim (Urun sınıfını birazdan oluşturacağız). Urunler özelliğini, Entity Framework’ün Lazy Loading özelliğini kullanabilmek için virtual olarak tanımlıyoruz.

public class Kategori
{
    public int KategoriId { get; set; }
    public string Ad { get; set; }
        
    public virtual List<Urun> Urunler { get; set; }
}

6. Urun sınıfında UrunId (int), Ad (string), Fiyat (double), StokMiktar (int), KategoriId (int) (scalar) özellikleri yer alsın. Ürünün bağlı olduğu kategoriyi alabilmek için Kategori tipinde Kategori ismindeki (navigation) özelliğini de ekleyelim. Bu özelliği de virtual olarak tanımlıyoruz.

public class Urun
{
    public int UrunId { get; set; }
    public string Ad { get; set; }
    public double Fiyat { get; set; }
    public int StokMiktar { get; set; }
    public int UrunId { get; set; }
        
    public virtual Kategori Kategori { get; set; }
}

7. MagazaContext sınıfının kalıtımını Entity Framework’ün base typeı olan DbContext (System.Data.Entity.DbContext) sınıfından alalım. Bu sınıfın özelliği, veritabanı üzerinde oturum (session) işlemlerini gerçekleştirip oluşturulan oturumlar üzerinden işlemlerin yapılmasını sağlar.

public class MagazaContext : DbContext { }

8. MagazaContext sınıfında, veri türlerimizin (Urun ve Kategori) veritabanında CRUD işlemlerini gerçekleştirebilmek için Urunler (DbSet<Urun> tipinde) ve Kategoriler (DbSet<Kategori> tipinde)  isimli özelliklerimizi oluşturalım.

public class MagazaContext : DbContext
{
    public DbSet<Kategori> Kategoriler { get; set; }
    public DbSet<Urun> Urunler { get; set; }
}

9. MagazaContext sınıfını da oluşturduktan sonra Program > Main metodundan bir kaç kategori kaydı girelim: “Bilgisayar”, “Cep Telefonu”, “Televizyon

MagazaContext entity = new MagazaContext();

Kategori kategori1 = new Kategori() { Ad = "Bilgisayar" };
Kategori kategori2 = new Kategori() { Ad = "Cep Telefonu" };
Kategori kategori3 = new Kategori() { Ad = "Televizyon" };

entity.Kategoriler.Add(kategori1);
entity.Kategoriler.Add(kategori2);
entity.Kategoriler.Add(kategori3);

entity.SaveChanges();

10. Eklediğimiz kategorileri ekranda yazdıralım.

MagazaContext entity = new MagazaContext();
 
var kategoriler = entity.Kategoriler.OrderBy(k => k.Ad);
foreach (var kategori in kategoriler)
{
    Console.WriteLine(kategori.Ad);
}

Şimdiye kadar yaptığımız işlemleri gözden geçirelim:

  • Kategori sınıfını oluşturduk ve kategoriye bağlı ürünlerin alınabilmesini sağladık.
  • Urun sınıfını oluşturduk ve ürünün bağlı olduğu kategori bilgisini alabilmesini sağladık.
  • Veritabanı işlemleri için MagazaContext sınıfını oluşturduk.
  • 3 tane kategoriyi veritabanına ekledik.
  • Veritabanından eklediğimiz kategorileri çektik.

Her şey iyi güzel de, veritabanı nerede? :)

Veriler, Visual Studio 2012 ile çalışırken localdb’ye kaydedilir. Eğer Visual Studio 2010'da çalışıyorsanız SqlExpress’e kaydedilir. Entity Framework’ün proje çalışırken sunucuda veritabanı ve tabloların varlığını kontrol eder. Yoksa önce veritabanını ve tabloları oluşturur, sonra işlemleri yapmaya başlar. Verilere Visual Studio üzerinden ulaşabilmek için aşağıdaki adımları takip edelim.

1. Visual Studio > SQL Server Object Explorer üzerinden Add Sql Server butonuyla yeni bir SQL Server bağlantısı oluşturalım.

2. Server name (sunucu adı) bölümüne (localdb)\v11.0 yazalım (VS 2012 için) ve Connect butonuna tıklayalım.

3. Bağlantı oluştuğunda (localdb)\v11.0 altında veritabanı görünecektir (Bendeki örnek için Makale.EFCodeFirst_01.MagazaContext isimli veritabanı).

4. Eklediğimiz kategori verilerine erişebilmek için dbo.Kategoris tablosuna sağ tıklayıp View Data seçeneğini seçelim. Eklediğimiz veriler karşımıza gelecektir.

Sonraki makalelerimde (bu konu bir makale serisi olacak) Entity Framework (Code First) modeli yapılandırmayı ve Entity Framework ile Design Patternların nasıl kullanılacağını inceleyeceğiz.

 

Yepyeni makalelerde görüşmek dileğiyle :)

Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com