Diyelim ki 10 müşterinizin kullandığı bir uygulamanız var. Uygulama her müşterinin kendi sunucusunda tutuluyor. Siz programa yeni özellikler eklediğiniz zaman haliyle veritabanı yapısında da değişiklikler oluyor. Bu değişiklikleri müşterilerinize nasıl uyguluyorsunuz? Her birine tek tek elle mi tablo veya sütun ekliyorsunuz? Yoksa sql oluşturup hepsinde onu mu çalıştırıyorsunuz? İki veritabanı arasındaki farkın sqlini çıkartmanın kolay bir yolu var mı? (Bu arada projemde kullandığım alt yapı asp.net MVC, Entity framework,MS Sql server).

Teşekkürler.

soruldu: 21 Kas '15, 04:09

emrekacan's gravatar image

emrekacan
813304450
cevap kabul oranı: 9%


Entity Framework senin için bunu otomatik olarak yapıyor. Eğer "Code-first" yaklaşımını kullandıysan şurdaki tutoriale bakıp hızlıca implemente edebilirsin. Database-First yaklaşımını kullandıysan, yani .edmx dosyaları üzerinden EF kullanıyorsan böyle bir özelliği yok, bu durumda scriptleri kendin manuel üretip, ordan databaseyi güncellemen lazım.

"MigrateDatabaseToLatestVersion" "strategy"si, modelde olan değişikliği otomatik olarak database tarafında da implemente eder. Eğer istersen hard-coded biçimde, bu updatei nasıl yapacağını da yazabilirsin. Linkteki tutorialde "Automated" ve "Code-Based(Handmade)" biçimde nasıl yapılacağını anlatmış.

Eğer ki yaptığın güncellemeleri otomatik olarak implemente eden bir ORM'ye sahip değilsen, bence en güzel çözüm şöyle olur. Veritabanında VersionHistory diye bir tablo oluştur. Orada tek bir satır bulunucak, o satıra şu anki versiyonu kaydet, örneğin 1 veya 12 gibi. Ondan sonra şu anki versiyondan bir sonraki versiyona geçiş stratejilerini belirle. Yani pratikte şöyle bir metodumuz olduğunu düşünelim. Aşağıdaki else if blokları yerine daha güzel object-oriented bir yapı kurulabilir ama basit ve anlaşılabilir olması açısından böyle yazdım.

protected void onMigrating(int databaseVersion, int applicationVersion){

   if(databaseVersion == applicationVersion)
        return;

    if(databaseVersion < applicationVersion){
    string sqlQuery = "";
         if(databaseVersion == 1)
              sqlQuery = "ALTER TABLE bla bla bla, CREATE TABLE Something";
              setDatabaseVersion();//Database'nin versiyonunu güncelle. Yani VersionHistory tablosundaki sayıyı güncelle.
              onMigrating(databaseVersion + 1, applicationVersion);//Burda recursive olarak bu fonksiyonu tekrar çağırıyoruz.
         else if(databaseVersion == 2)
              sqlQuery = "ALTER TABLE bla bla bla, CREATE TABLE Something"//Buraya 1. versiyondan 2. versiyona geçişi implemnete ediceksin.
         else if(databaseVersion == 3)
              sqlQuery = "ALTER TABLE bla bla bla, CREATE TABLE Something"
    }

}
permanent link

cevaplandı: 21 Kas '15, 04:44

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 21 Kas '15, 05:09

Yeni projelerimde code first kullanıyorum ama bu eski bir proje ve database first kullnıyorum ne yazıkki. Kendi methodunu yazmak güzel fikir. Teşekkürler.

(21 Kas '15, 05:19) emrekacan emrekacan's gravatar image

Code-first daha başarılı bi yöntem bence. Geliştiriciyi veritabanından bağımsız kılıyor hem de daha esnek bi yapı sunuyor, haliyle de bu örnekde olduğu gibi zaman olarak geri dönüyor. Önemli değil, umarım işine yaramıştır

(21 Kas '15, 09:41) ArnesTwin ArnesTwin's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×81
×66
×18
×3

Soruldu: 21 Kas '15, 04:09

Görüntüleme: 350 kez

Son güncelleme: 21 Kas '15, 09:41

powered by BitNami OSQA