Entity Framework Database First, Model First, Code First Yaklaşımları

Entity Framework, ORM modellemede 3 farklı yaklaşım kullanır. Bunlar ;

  • Database First Yaklaşımı
  • Model First Yaklaşımı
  • Code First Yaklaşımı

Her bir yaklaşımın kendine has avantaj ve dezavantajlarıolmakla birlikte bunları göz önünde bulundurarak projenizde kullanacağınız yaklaşımı seçebilirsiniz.

DATABASE FIRST YAKLAŞIMI

Database First , yeni bir entity model oluşturmak için, adından da anlaşılacağı üzere önceliği veritabanı olarak görür. Yani modeli, hazırda bulunan bir veritabanından oluşturur. Eğer uzun zamandır kullanılan bir veri tabanı üzerinde çalışacak ve bu veritabanı için bir model oluşturacaksanız bu yaklaşımı tercih etmelisiniz. Bu yaklaşımda çalışma yöntemi olarak daha çok server tarafında işlemler yapılır ve değişiklikler modele aktarılır.

Elimizde aşağıdaki gibi önceden oluşturduğumuz basit bir tablo olsun.

  • Bir console uygulaması açıp projemizin üzerine sağ tuşla tıklayıp ‘Ekle/Add’ seçeneğini seçelini buradan da ‘Yeni Öğe Ekle/Add New Item’ seçeğini seçelim. Karşımıza gelen ekrandan da  projemize bir ADO.net ekleyelim.

  • Daha sonra EF Designer From Database seçeneğini seçelim.

  • Hemen arkasından karşımıza gelen sayfada New Connection opsiyonundan Server name ile serverımız seçip alt tarafta aktif olan yerlerden hangi db üzerinde çalışacağımı seçelim.
  • Daha sonra karşımıza çıkan sayfadan var olan hangi tabloları kod tarafında modelleyeceğimiz seçeriz.

  • Son dememizle beraber de veri modellerimiz kod tarafında modellenmiş olur.

Database first yaklaşımından yararlanabileceğimiz bazı durumlar…

  • Az değişen şemalarla, uzun ömürlü veritabanlarında kullanılabilir.
  • Modelinizi bir diyagramda görmek ve buradan güncellemek istiyorsanız kullanılabilir.
  • Modelinizi çakışmayan diyagramlara bölmek isterseniz kullanılabilir.
  • DBA’lar tarafından tasarlanmış bağımsız geliştirilen bir veritabanınız var ise kullanılabilir.
MODEL FIRST YAKLASIMI

Bu yaklaşım, sıfırdan bir veritabanı oluşturarak projeye başlanması gereken durumlar için ideal olabilmektedir. Kod yazmadan ya da serverda fiziksel database ile ilgilenmeden, tamamen entity model üzerinden veritabanı oluşturmak için kullanılan yaklaşımdır. Entity user interfacesi üzerinden modellediğiniz verilerinizi generate ettiğinizde hem database tarafında hem de kod tarafında otomatik olarak oluşurlar.

Model First ile basit bir modelleme örneği yapalım.

  • Yine yukarıda olduğu gibi projemizin üzerine sağ tuş işe tıklayım Add new Item diyerek bir ADO.net ekleyelim. Bu sefer Empty EF Designer Modeli seçelim.

  • Daha sonra önümüze boş bir alan gelicek. Bu alan bizim model tasarımımızı yapacağımız alan olacak ve toolbox üzerinden sürükle bırak ile ihtiyacımız olan araçları kullanacağız.

    Kısaca özet geçmek gerekirse 

           Entity : Veri modeli oluşturmaya yarar. Oluşturulan veri modeli db’de tablo ve kod tarafında model class olarak modellecek.
           Association : Tablolar arası ilişki kurmaya yarar.

  • Sürükle bırak ile aşağıdaki gibi entitylerimizi oluşturalım. Oluşturduğumuz entitylere yeni propery eklemek için entitye sağ tuş ile tıklayıp Add –> Scalar propery seçeneğini seçeriz. Önemli noklatardan biri de oluşturduğumuz propertynin , entitynin veya ilişkinin ayarlarını değiştirmek istiyorsak ilgili yere tıklayıp F4 tuşuna basmalıyız.
  • Tabloları birbiriyle ilişkilendirdikten sonra tablolara ekstra birer propery geldiğini göreceksiniz bu propertyler navigation propertydir. Hazır adı geçmişken navigation propertyi de tanımlayalım. Navigation property, Entity Framework’ün, iki entity ilişkilendirildiğinde otomatik olarak oluşturduğu, iki entity arasındaki bağdan kaynaklanan bir özelliktir. Bu özellik sayesinde, tıpkı SQL ile join işlemi yapıyormuşuz gibi, ilişkili iki tablonun birinden diğerine erişerek ilişkili kayıtları sorgulayabiliriz.

  •   Herşeyimiz hazırsa artık entity modellerimiz üzerinden daha generate işlemine başlayabilirz. Yapmamız gereken , entity modellerimizi oluşturduğumuz alana sağ tuş ile tıklayıp Generate Database From Model seçeneğini seçmek ve daha sonrasında aşağıdaki pencere önümüze gelecek. Bu pencerede yukarda Database Firstde de yaptığımız gibi new connection üzerinden kendi server namemizi ve db ismimizi belirleyeceğiz. Hazırladığımız entity modeller belirlediğimiz database’de oluşacak.

  • Connectionu belirledikten sonra ileri dediğimizde aşağıdaki scriptler gelecek. Bu scriptler bizim hazırladığımız entityleri sql tarafında oluşturacak scriptlerdir. Bunları bir gözden geçirdikten sonra sol üst köşedeki run simgesine basıp hem database tarafında tabloları hem de kod tarafındaki modelleri oluşturmuş oluruz 🙂

 

CODE FIRST YAKLASIMI

Code First, adından da anlaşılacağı üzere kod ile veritabanı ve entity modeli tasarlama yaklaşımıdır. Yapmanız gereken tek şey kodlarla entity classlarını tanımlamak olacaktır.

Hemen bir örnekle somutlaştıralım.

  • ilk olarak Kitap isimli classımızı oluşturalım. Bu oluşturacağımız kitap classı kodlama bittikten sonra db tarafında bir tablo olarak oluşacaktır. Her kitabın bir yazarı olduğunu varsayarsak bir de yazar isimli bir classımız olacak ve kitap classı ile yazar classı arasında ilişki kurmamız gerekecek. Bu sebeple classın içerisine bir de Yazar tipinde bir property ekleyelim.
public class Kitap
{
    public int KitapId { get; set; }

    public int YazarId { get; set; }

    public string Adı { get;  set; }

    public string BasımYılı { get; set; }

    public virtual Yazar Yazar { get; set; }
}

  • Daha sonrasında Yazar isimli clasımızı oluşturalım. Bir yazarın birden fazla kitabı olabileceğinden Yazar ile kitap arasında bire çok ilişki var diyebiliriz. Bu sebeple Yazar classımıza  Kitaplar isimli propertyi List olarak tanımlarız.
    Sizin de farkettiğiniz üzere code firstte tablolar arası ilişki kurmak bu kadar basit ve zahmetsiz. 🙂
 public class Yazar
 { 
   public int YazarId { get; set; }

   public string Adı { get; set; }

   public string Soyad { get; set; }

   public virtual List<Kitap> Kitaplar { get; set; }

}
  • Entitylerimizi oluşturup aralarındaki ilişkiyi de belirlediğimize göre artık Data Access Clasımızı oluşturabiliriz.      

              Oluşturduğumuz DataAccessClassı DbContext classından kalıtırız. DbContext classı Entity Framework içerisinden gelip bize, entitylerimiz için bir nevi Unit Of Work ve Repository pattern sunar.
              Daha sonra oluşturduğumuz entitylerin DbSetlerini oluştururuz. Bu Dbsetlerin her biri tablolar ile Get/Add/Remove/Update/ gibi işlemleri üzerinden yapacağımız yapılardır.
              –Diğer önemli nokta da classın constructor ile üst classa göndereceğimiz string. Bu string bizim connectionNameimiz olacaktır.

public class DataAccessClass : DbContext
{
     public DataAccessClass() : base("myConnectionName")
     {
     }

     public DbSet<Kitap> Kitaplar { get; set; }
     public DbSet<Yazar> Yazarlar { get; set; }
}

Son olarak da config dosyamızın içerisinde connectionımızı oluşturmamız yeterli olacaktır.

<connectionStrings>
  <add name="myConnectionName" connectionString="Server=SERVERNAME ;  Database=DATABASENAME; Integrated security=true" providerName="System.Data.SqlClient"/>
</connectionStrings>

İşlem bu kadar, bundan sonra yapmanız gereken tek şey projeyi run etmek 🙂

Code First Yaklaşımı ile Tablo Konfigurasyonlarından Bazıları

code first ile tabloları oluştururken belli başlı ayarlamalar yapabiliriz. Bunun için DbContext sınıfındaki   OnModelCreating(DbModelBuilder modelBuilder) metodunu override etmemiz gerekir.

a.Tablo ismi belirleme

Aşağıdaki fonksiyonu DataAccessClass içerisine koyarak tablo isimlerimizi belirleyebiliriz. Kitap entitylerini tutacağımız tablonun adı kitap, Yazar entitylerini tutacağımız tablonun adı da yazar olsun. 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  Database.SetInitializer<DataAccessClass>(new DropCreateDatabaseAlways<DataAccessClass>());
  modelBuilder.Entity<Kitap>().ToTable("Kitap");
  modelBuilder.Entity<Yazar>().ToTable("Yazar");

}

b.Tablo initialize stratejisi belirleme

 Database.SetInitializer<DataAccessClass>(new DropCreateDatabaseAlways<DataAccessClass>());   ifadesi de bir tablo initilaze stratejisidir. Tablolar SetInıtilaizerin içine koyacağınız argumana göre initilaze edilir.

CreateDatabaseIfNotExist : Eğer sunucuda, oluşturmak istenen database bulunmuyorsa yeni databasei oluşturur. Varsayılan initilazie ayarı budur.
DropCreateDatabaseIfModelChanges : Eğer sunucudaki databasein şema ya da model yapısında bir değişiklik varsa databasei önce siler sonra yeniden oluşturur.
DropDatabaseAlways : Her zaman databasei önce sunucudan siler sonra yeniden oluşturur.

Code first yaklaşımından yararlanabileceğimiz bazı durumlar…

  • Veri tabanı bilgisine ihtiyaç olmadan proje geliştirilmek istendiğinde kullanılabilir.
  • Veritabanı tasarımında hoşlanmayan yazılımcılar tarafından kullanılabilir.
  • İş kurallarının ve işleyişin veritabanında olmasını istenmediği durumlarda kullanılabilir. Veritabanı sadece bir saklayıcıdır.

 

You may also like...

1 Response

  1. Ali Osman KÜÇÜKKARAASLAN dedi ki:

    Merhabalar, emeğinize sağlık güzel makale olmuş. Sizlere bir sorum olacak. DB-First yaklaşımı ile yazılım geliştiriyorum. Tablo sayım oldukça fazla ve bağlantıları da öyle. Tüm veri tabanını tek bir modelde topladım ve onun üzerinden çalışıyorum ancak Model güncellerken 10 dakikaya yakın hatta daha fazla beklemem gerekiyor. Sizce ne yapmalıyım?

Bir cevap yazın

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