Entity Framework için veritabanı nasıl yeniden oluşturulur?


143

ASP.NET MVC 5 projem ile Code-First Entity Framework kullanarak kötü bir durum var. Veri kaybetmeyi umursamıyorum, sadece yeni başlayabilmek, veritabanını yeniden oluşturmak ve İlk Kod geçişlerini kullanmaya başlamak istiyorum.

Şu anda Update-Database her girişim atılır veya bir hata mesajı alma bir istisna neden bir durumda. Ayrıca web sitesi veritabanına doğru şekilde erişemiyor. Yeni bir proje oluşturmak zorunda kalmadan tüm taşıma işlemlerini nasıl silebilir, veritabanını yeniden oluşturabilir ve sıfırdan nasıl başlayabilirim? Başka bir deyişle, kodumu tutmak istiyorum ama veritabanını bırakın.

Daha sonra dağıtım veritabanını (Azure'da SQL Server) senkronize etmek istiyorum. Yine, tüm verileri bırakmayı umursamıyorum - sadece çalışmasını istiyorum.

Temiz bir duruma geri dönmek için lütfen nasıl yapılır adımlarını girin. Çok takdir etmek.


TBH basit istiyorsanız DROP DATABASEo zaman ....
Worthy7

Yanıtlar:


209

Aşağıdaki adımları izleyin:

1) Önce Visual Studio'da Sunucu Gezgini'ne gidin, bu proje için ".mdf" Veri Bağlantıları'nın bağlı olup olmadığını kontrol edin, varsa sağ tıklayın ve silin.

2) Çözüm Gezgini'ne gidin, Tüm Dosyaları Göster simgesini tıklayın.

3) App_Data'ya gidin, sağ tıklayın ve bu proje için tüm ".mdf" dosyalarını silin.

4) Sağ tıklama ve silme ile Migrations klasörünü silin.

5) SQL Server Management Studio'ya gidin, bu proje için DB'nin orada olmadığından emin olun, aksi takdirde silin.

6) Visual Studio'da Paket Yöneticisi Konsolu'na gidin ve şunu yazın:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Başvurunuzu çalıştırın

Not: Adım 6 bölüm 3'te "Dosya eklenemiyor ..." hatası alırsanız, bunun nedeni büyük olasılıkla SQL Server'da veritabanı dosyalarını tamamen silmemenizdir.


Mükemmel! Bu işe yaradı, teşekkürler! Gerçekten çok yardımcı. Dağıtım veritabanını (Azure SQL) yeniden oluşturmak için adımlar benzer mi?
Toby Sharp

hi @TobySharp, sorun yok. Veritabanınızda veri yoksa, bu adımları takip edebilirsiniz, ancak verileriniz varsa, adımlar aynı değildir.
Lin

Saklamam gereken herhangi bir veri yok.
Toby Sharp

3
Güncelleme, Windows Gezgini'nden değil, VS'den (talimatların dediği gibi) silerseniz, o zaman çalışır. Ayrıca, SQL Management Studio'nuz yoksa, localdb'den silmek için VS'de Sql Nesne Gezgini'ni kullanabilirsiniz.
Mike Ward

3
"Dosya eklenemiyor ..." hatasını alıyorsanız, her şeyi sildiğinize rağmen, şu konudaki cevabı deneyin: stackoverflow.com/questions/13275054/…
Andy

44

Lin'in cevabının doğru olduğunu eklemek isterim.

MDF'yi yanlış bir şekilde silerseniz, düzeltmeniz gerekir. Projedeki vidalı bağlantıları MDF'ye sabitlemek için. Kısa cevap; yeniden oluşturun ve silin.

  1. Yeni bir MDF oluşturun ve eski MDF ile aynı şekilde adlandırın, aynı klasör konumuna koyun. Yeni bir proje oluşturabilir ve yeni bir mdf oluşturabilirsiniz. Silinecekleri için mdf'nin eski tablolarınızla eşleşmesi gerekmez. Bu yüzden eskisini oluşturun veya doğru klasöre kopyalayın.
  2. Sunucu gezgininde açın [çözüm gezgininden mdf'ye çift tıklayın]
  3. Sunucu gezgininde silin
  4. Çözüm gezgininden silin
  5. çalıştırmak update-database -force [kullanımlar kuvvet gerekirse]

Bitti, yeni db'nizin tadını çıkarın

GÜNCELLEME 11/12/14 - Ben her zaman bir kırılma db değişikliği yaptığımda kullanıyorum. Bu orijinal db için taşıma geri almak için harika bir yol buldum:

  • Db'yi orijinaline geri koyar
  • Akıma geri koymak için normal geçişi çalıştırın

    1. Update-Database -TargetMigration:0 -force [Bu, tüm tabloları ve tüm verileri yok edecektir.]
    2. Update-Database -force [gerekirse güç kullanın]

1
Yardım etmekten çok memnunum ... Cevabımı güncelleyeceğim. Son zamanlarda tüm değişiklikleri geri almanın daha iyi bir yolunu buldum.
Steve Coleman

8

Bu benim için çalıştı:

  1. Visual Studio'da SQL Server Nesne Gezgini'nden veritabanını silin. Sağ tıklayın ve sil'i seçin.
  2. Hala oradalarsa, mdf ve ldf dosyalarını dosya sisteminden silin.
  3. Çözümü Yeniden Oluşturun.
  4. Uygulamayı Başlat - veritabanı yeniden oluşturulacaktır.

1
Evet, tek yapmam gereken MDF'yi silmek, web.config dosyasındaki bağlantı dizesini güncellemek, ardından uygulamayı çalıştırmak ve yeni bir hesap kaydetmekti. Tüm tabloları otomatik olarak yeni veritabanında yeniden oluşturdu.
Dan Bechard

3

Bu soru, veriyi önemsememekle ön plana çıksa da, bazen verilerin bakımı önemlidir.

Öyleyse, veritabanı burada aynı ada sahip tablolar olduğunda Entity Framework kabusundan nasıl kurtarılacağına ilişkin adımların bir listesini yazdım: Entity Framework kabusundan nasıl kurtarılır - veritabanı zaten aynı ada sahip tablolar içeriyor

Görünüşe göre ... bir moderatör yazımı silmek için uygun gördü, bu yüzden buraya yapıştıracağım:

Entity Framework kabusundan nasıl kurtarılır - veritabanı zaten aynı ada sahip tablolara sahip

Açıklama : Ekibiniz EF'de yeniyse bizim gibi iseniz, ya yeni bir yerel veritabanı oluşturamayacağınız ya da üretim veritabanınıza güncelleme uygulayamayacağınız bir durumla karşılaşırsınız. Temiz bir EF ortamına geri dönmek ve daha sonra temel özelliklere bağlı kalmak istiyorsunuz, ancak yapamazsınız. Üretim için çalışmaya başlarsanız, yerel bir db oluşturamazsınız ve yerel olarak çalışmasını sağlarsanız, üretim sunucunuz eşitlenmez. Son olarak, üretim sunucusu verilerini silmek istemezsiniz.

Belirti : Oluşturma komut dosyasını çalıştırmaya çalıştığı ve veritabanında zaten aynı ada sahip tablolar olduğu için Update-Database çalıştırılamıyor.

Hata iletisi: System.Data.SqlClient.SqlException (0x80131904): Veritabanında zaten '' adında bir nesne var.

Sorun Arka Plan : EF, veritabanında dbo .__ MigrationHistory adlı bir tabloya dayanarak, kodun bulunduğu konumla karşılaştırıldığında geçerli veritabanının nerede olduğunu anlar. Geçiş Komut Dosyalarına baktığında, komut dosyalarında en son nerede olduğunu yeniden denemeye çalışır. Eğer yapamazsa, onları sırayla uygulamaya çalışır. Bu, ilk oluşturma komut dosyasına geri döner ve UP komutunun ilk bölümüne bakarsanız, hatanın oluştuğu tablo için CreeateTable olacaktır.

Bunu daha ayrıntılı olarak anlamak için, burada belirtilen her iki videoyu da izlemenizi öneririz: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Çözüm : Yapmamız gereken şey, EF'yi bu CreateTable komutlarını uygulamadan geçerli veritabanının güncel olduğunu düşünmesi için kandırmaktır. Aynı zamanda, yeni yerel veritabanları oluşturabilmemiz için bu komutların var olmasını istiyoruz.

Adım 1: Üretim DB temiz Öncelikle, üretim db yedekleyin. SSMS'de, veritabanına sağ tıklayın, "Görevler> Veri katmanı uygulamasını dışa aktar ..." seçeneğini seçin ve komut istemlerini izleyin. Üretim veritabanınızı açın ve dbo .__ MigrationHistory tablosunu silin / bırakın.

Adım 2: Yerel ortam temizleme Taşıma klasörünüzü açın ve silin. Gerekirse tüm bunları git'ten geri alabileceğinizi varsayıyorum.

Adım 3: İlkini Yeniden Oluşturun Paket Yöneticisinde "Etkinleştir-Geçişleri" çalıştırın (EF, birden fazla bağlamınız varsa -ContextTypeName kullanmanızı isteyecektir). "Add-Migration Initial -verbose" komutunu çalıştırın. Bu, geçerli koda dayalı olarak sıfırdan veritabanı oluşturmak için ilk komut dosyasını oluşturur. Önceki Configuration.cs dosyasında herhangi bir çekirdek işleminiz varsa, bunu kopyalayın.

Adım 4: Trick EF Bu noktada, Update-Database'i çalıştırırsak orijinal hatayı alırdık. Bu nedenle, EF'i bu komutları çalıştırmadan güncel olduğunu düşünmesi için kandırmamız gerekir. Bu nedenle, az önce oluşturduğunuz İlk geçişte Yukarı yöntemine gidin ve hepsini yorumlayın.

Adım 5: Güncelleme-Veritabanı Yukarı işleminde yürütülecek kod olmadan EF, bu betiği doğru çalıştırdığını söylemek için doğru girişle dbo .__ MigrationHistory tablosunu oluşturur. Gidin ve isterseniz kontrol edin. Şimdi, bu kodu uncomment ve kaydedin. EF'in güncelliğini düşündüğünü kontrol etmek istiyorsanız, Güncelleme-Veritabanını tekrar çalıştırabilirsiniz . Yukarı adımını tüm CreateTable komutlarıyla çalıştırmaz, çünkü zaten bunu yaptığını düşünür.

Adım 6: EF'in GERÇEKTEN güncel olduğunu doğrulayın Henüz henüz taşıma işlemi yapılmamış bir kodunuz varsa, yaptığım şey budur ...

"Add-Migration MissingMigrations" komutunu çalıştırın. Bu, neredeyse boş bir komut dosyası oluşturur. Kod zaten orada olduğundan, aslında ilk geçiş komut dosyasında bu tabloları oluşturmak için doğru komutlar vardı, bu yüzden sadece CreateTable ve eşdeğer drop komutlarını Yukarı ve Aşağı yöntemlerine kestim.

Şimdi, Update-Database'i yeniden çalıştırın ve veritabanında uygun tabloları oluşturarak yeni geçiş komut dosyanızı yürütmesini izleyin.

7. Adım: Yeniden onaylayın ve onaylayın. Oluşturun, test edin, çalıştırın. Her şeyin çalıştığından emin olun, sonra değişiklikleri yapın.

Adım 8: Ekibinizin geri kalanına nasıl ilerleyeceğini bildirin. Bir sonraki kişi güncellediğinde, EF daha önce çalıştırdığı komut dosyalarının mevcut olmadığı göz önüne alındığında, onu neyin vurduğunu bilemez. Ancak, yerel veritabanlarının uçurabildiğini ve yeniden oluşturulabileceğini varsayarsak, hepsi iyi. Yerel veritabanlarını bırakmaları ve tekrar EF'den oluşturmaları gerekecek. Yerel değişiklikleri ve bekleyen taşıma işlemleri varsa, DB'lerini yeniden master oluşturmaları, özellik dallarına geçmeleri ve bu taşıma komut dosyalarını sıfırdan yeniden oluşturmaları önerilir.


1

@Lin'in mükemmel cevabına eklemek istiyorum:

5) B. SQL Management Studio'nuz yoksa "SQL Server Nesne Gezgini" ne gidin. Projenizin db dosyasını localdb "SQL Server Nesne Gezgini" nde göremiyorsanız, listeye manuel olarak eklemek için "SQL sunucusu ekle" düğmesine tıklayın. Sonra listeden db silebilirsiniz.


Bir yanıta bir şeyler eklemek istiyorsanız, lütfen yeni bir yanıt göndermek yerine bu cevaba bir yorum ekleyin.
Oliver

1
Bunun farkında değildim. Şimdi cevabınızı bir yoruma taşıyabilir ve bu cevabı silebilirsiniz, çünkü teknik olarak bu soruya (tam) bir cevap değildir :-)
Oliver

0

Benim için işe yarayan olası çok basit bir düzeltme. Sunucu / serverobject gezgininde bulduğunuz veritabanı referanslarını ve bağlantıları sildikten sonra, App_Data klasörünü sağ tıklayın (uygulama içinde hiçbir nesneyi bana göstermedi) ve aç'ı seçin. Bir kez açık tüm veritabanı koymak / vb. dosyaları bir yedekleme klasöründe veya bağırsak varsa sadece onları silin. Uygulamanızı çalıştırın ve her şeyi sıfırdan oluşturmanız gerekir.


0

Benim çözüm için en uygun :
- mdf dosyanızı sildi
- db yeniden oluşturmak istiyorum.

İçin veritabanı yeniden Visual Studio kullanarak bağlantı eklemek gerekmez.

Adım 1 : Sunucu Gezgini'ne gidin, yeni bağlantı ekleyin (veya db ekle simgesini arayın).

2. Adım : Değişim Veri kaynağı için Microsoft SQL Server veritabanı dosyası .

Adım 3 : İstediğiniz herhangi bir veritabanı adını Veritabanı dosya adı alanına ekleyin . (Tercihen web.config AttachDbFilename özniteliğinde bulunanla aynı addır )

4.Adım : Göz at'ı tıklayın ve bulunmasını istediğiniz yere gidin.

Adım 5 : Paket Yöneticisi Konsolunda Çalıştır Komutuupdate-database

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.