Entity Framework Code First Migration - Database Güncelleme

System.InvalidOperationException: 'The model backing the 'DataBaseContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).'
Hatası ve Çözümü 
Entity Framework Code First yaklaşımı ile kullanılıyorsa veritabanı yapısında değişiklik yapıldığında tüm veritabanı tekrardan oluşuyor. Bu da aktif uygulamalarda geliştirme yaparken ciddi bir sıkıntı haline geliyor. Neyse ki Microsoft Entity Framework 4.3 ile Code First‘e Migrationözelliği eklemiş. Bu sayede sıfırlanmadan veritabanı üzerinde istenen değişiklikler gerçekleştirilmiş oluyor. Şimdi bu nasıl yapılıyor  adım adım inceleyebilirsiniz.
Öncelikli olarak modelinizi barındıracağınız bir class oluşturmanız gerekmektedir.


EFCodeFirstMigration-SolutionExplorer
Bu class içerisinde tablolarınız için gereken kolonları property olarak tanımlayabilirsiniz. Burada dikkat etmeniz gereken nokta örnekte namespace kullanılmamıştır. Siz isterseniz rahatlıkla kullanabilirsiniz.
Tablonun oluşturulması için gerekli tanımlamalar ayarlandığına göre veritabanının otomatik oluşturulması için DbContext sınıfından türeyen bir Context Class oluşturulması gerekmektedir. (Ben örnekte BlogContext isimli class üzerinden bu işlemi gerçekleştireceğim.
EFCodeFirstMigration-SolutionExplorer2
Bu Context Classıda aşağıdaki şekilde tanımlayabilirsiniz.
Artık veritabanının oluşturulması için tek bir adım kaldı. O da Conntection String ifadesini yazmak. Bunun için aşağıdaki şekilde bir örnek bıraktım. Siz kendi ayarlarınıza göre değişiklilerinizi yapabilirsiniz.
Bu işlemlerden sonra projeniz içerisinde herhangi bir veritabanına bağlı işlem yaptığınızda veritabanınızın otomatik oluşturulduğunu göreceksiniz.
Tüm bu işlemler bittikten sonra artık Migration kullanımına geçebilirsiniz. Şimdi Blog tablosu içerisindeki kolonlarda değişiklik, güncelleme ve ekleme yapmak istediğinizi düşünelim. Bu durumda ilk başta belirtildiği gibi Migration özelliğini devreye koymanız gerekmektedir.  Migrationkullanabilmek için öncelikle özelliği Package Manager Console kullanarak aşağıdaki komutlarla etkinleştiriniz. 
Yukarıdaki adımı gerçekleştirdiğinizde proje dizininizde Migrations isminde bir klasör oluşacaktır. İçerisinde bulunan configuration classından aktif olup olmadığını rahatlıkla görebiliyoruz. Fakat buradaki 4. satırı sizin bu configuration classına eklemeniz gerekiyor. Eğer eklemezseniz veri tipi dönüşümlerinde ve kolon kaldırma işlemlerinde veri kaybı olacağından dolayı model hata verip güncellenme yapılmayabilir.
Configuration işlemini yaptığınıza göre artık modeli güncellemek için aşağıdaki gibi 3 tane classoluşturunuz.
1. Class: Blog tablosuna kolon eklemek için oluşturulmuştur.
2. Class:, Blog tablosundan kolon kaldırmak için oluşturulmuştur.
3. Class: Blog tablosundaki kolonu güncellemek için oluşturulmuştur. Kısaca 3 farkı örneği gerçekleştirmiş oluyorsunuz.
Tabi bu yukarıdaki classları tek tek eklemenize gerek yok. Package Manager Console ile aşağıdaki kodu kullanarak sizin için migration classlarının oluşturulmasını sağlayabilirsiniz. Oluşturulan classlar migrations klasörü altında yer alacaktır.
Yukarıda Migration classının oluşturulma işlemini de öğrendiğinize göre ilk class ile çalışmalara devam edelim.
Şimdi yukarıdaki kodu kullanarak AddColumnBlogIsTrue isimli classı oluşturabilirsiniz. Tek yapmanız gereken yukarıdaki kodu Package Manager Console üzerinde çalıştırmak olacaktır.
AddColumnBlogIsTrue.cs
Class oluşturulduğunda içerisinde sadece Up ve Down methodları olacaktır. Fakat siz yukarıdaki class içerisindeki Up methodunun komutlarını kullanarak Blog tablosuna Boolean tipinde ve IsTrue ismine sahip bir kolon eklemiş oldunuz. AddColumn methodunu incelerseniz de
1.parametre hangi tabloda işlem yapacaksanız o tablonun ismini istemektedir.
2. parametre oluşturulacak kolona verilecek ismi istemektedir.
3. parametre veri tipi, boş geçilebilirlik ve varsayılan değerleri içermektedir.
En son yazılım tarafındaki tüm değişiklik işlemlerinizi tamamladığınızda bu yapılanların geçerli olabilmesi için Package Manager Console dan Update-Database komutunu girmeniz gerekmektedir. Bu işlemi gerçekleştirdikten sonra yapılanların veritabanı üzerinde gerçekleştirildiğini görebilirsiniz.
Şimdi ise DropColumnBlogSummary isimli classı oluşturunuz.
DropColumnBlogSummary.cs
Class oluşturulduğunda içerisinde sadece Up ve Down methodları olacaktır. Fakat siz yukarıdaki class içerisindeki Down methodunun komutlarını kullanarak Summary ismine sahip kolonu kaldırabilirsiniz. DropColumn methodunu incelerseniz de
1.parametre hangi tabloda işlem yapacaksanız o tablonun ismini istemektedir.
2. parametre hangi kolonu kaldıracaksınız onun ismini istemektedir.
En son yazılım tarafındaki tüm değişiklik işlemlerinizi tamamladığınızda bu yapılanların geçerli olabilmesi için Package Manager Console dan Update-Database komutunu girmeniz gerekmektedir. Bu işlemi gerçekleştirdikten sonra yapılanların veritabanı üzerinde gerçekleştirildiğini görebilirsiniz.
Şimdi ise AlterColumnBlogClick isimli classı oluşturunuz.
AlterColumnBlogClick.cs
Class oluşturulduğunda içerisinde sadece Up ve Down methodları olacaktır. Fakat siz yukarıdaki class içerisindeki Down methodunun komutlarını kullanarak Blog tablosundaki Click ismine sahip kolonun veri tipini değiştirebilirsiniz. AlterColumn methodunu incelerseniz de
1.parametre hangi tabloda işlem yapacaksanız o tablonun ismini istemektedir.
2. parametre hangi kolonu değiştireceksiniz onun ismini istemektedir.
3. parametre yeni veri tipinini içermektedir.
En son yazılım tarafındaki tüm değişiklik işlemlerinizi tamamladığınızda bu yapılanların geçerli olabilmesi için Package Manager Console dan Update-Database komutunu girmeniz gerekmektedir. Bu işlemi gerçekleştirdikten sonra yapılanların veritabanı üzerinde gerçekleştirildiğini görebilirsiniz.
Modelinizdeki yaptığınız güncellemeler için DbMigration sınıfından türeyen yukarıdaki classlarınızı oluşturduktan sonra tablonuzun yapısını bu güncellemelere uygun hale getirmeniz gerekiyor.
Bu işlemi de yaptığınızda yapınızı sorunsuz bir şekilde kullanmanız gerekmektedir.
Alıntıdır: http://www.ahmetcancicek.com/post/entity-framework-code-first-migration/

Yorumlar

Bu blogdaki popüler yayınlar

Asp.Net ile Uyarı Mesajları Vermek (msgbox)

Asp.Net ile T.C. Kimlik Doğrulama (Mernis) Web Service ile

Asp.Net Eval Kullanımı