Varlık-Çerçeve Taşımalarını Sıfırla


299

Geçişlerimi kapattım IgnoreChanges, ilk geçişte kullandım , ancak şimdi tüm geçişlerimi silmek ve tüm mantıkla ilk geçişle başlamak istiyorum.

Klasördeki geçişleri sildiğimde ve denediğimde ve Add-Migrationtam bir dosya oluşturmuyorsa (boş - çünkü son, ancak şimdi silindi taşıma işlemimden bu yana herhangi bir değişiklik yapmadım).

Herhangi var mı Devre Dışı-Göçler ı yeniden böylece komut, Enable-Migrations?



3
Birden fazla bağlantı eğiliminiz varsa önemli bir not: geçişleri sıfırlarken hangisini kullanacağınızı belirtin, aksi takdirde tutarsızlıklar olduğunda sorunlara neden olabilecek her ikisine de uygulanmaya çalışır.
Jeroen Vannevel

Not: Taşıma işlemlerinizi silmediyseniz (sürüm denetimini doğru mu kullanıyorsunuz?), Db'nizi güncelleyebilirdiniz - ilk taşıma işleminiz için azaltmayı silmiş ve bu noktadan sonra yeni taşıma işlemleri oluşturabilirsiniz. Buraya bakın: stackoverflow.com/a/23793384/309634
DarcyThomas

Yanıtlar:


446

Gerek :

  1. Durumu silme: Projenizdeki taşıma klasörünü silin; Ve
  2. __MigrationHistoryVeritabanınızdaki tabloyu silin (sistem tablolarının altında olabilir); Sonra
  3. Paket Yöneticisi Konsolu'nda aşağıdaki komutu çalıştırın:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Olan veya olmayan kullanım -EnableAutomaticMigrations

  4. Ve son olarak, şunları yapabilirsiniz:

    Add-Migration Initial

5
^^ Anladım - bu bir TFS hatasıydı - TFS kullanıyorsanız "Etkinleştir ..." komutunu çalıştırmadan önce bir check-in yapmanız gerekir. : D
BrainSlugs83

7
Sürüm kontrolü kullanmıyorsanız, silmeden önce Tohum değerlerinizi kaydedin!
RyanJMcGowan

77
@RyanJMcGowan sürüm kontrolü kullanmıyorsanız, çalışmanızı kaybetmeyi hak ediyorsunuz. :-)
Mike Cole

4
@Tood. + 1'leyin. Beni çok kurtardı. Şimdi sadece EF ekibi tüm bunları Reset-Migrations komutuna dahil edebilseydi. Belki EF 6 ...
Gerald Davis

24
Varolan bir veritabanı için "Yukarı" işlevinin içeriğini yorumlamanız gerekir. Aksi takdirde, "Güncelleme-Veritabanı" çalıştırdığınızda bir hata alırsınız, tablonun zaten mevcut olduğundan şikayet eder
Guy

149

Sorun: Taşıma işlemlerinizi tamamladınız ve mevcut tablolarınızı silmeden sıfırlamak istiyorsunuz.

Sorun: EF tabloları sıfırdan oluşturmak istediğinden, veritabanındaki mevcut tablolarla geçişleri sıfırlayamazsınız.

Ne yapalım:

  1. Var olan taşıma işlemlerini Migrations_History tablosundan silin.

  2. Mevcut taşıma işlemlerini Taşıma Klasöründen silin.

  3. Eklenti taşıma Sıfırlama'yı çalıştırın. Bu, Geçiş klasörünüzde tabloların oluşturulmasını içeren bir taşıma oluşturur (ancak çalışmaz, bu nedenle hata yapmaz).

  4. Şimdi MigrationHistory tablosunda ilk satırı oluşturmanız gerekir, böylece EF geçerli durumun anlık görüntüsünü alır. Bir taşıma işlemi uygularsanız EF bunu yapar. Ancak, tablolarınız veritabanınızda zaten var olduğundan, yeni yaptığınız taşıma işlemini uygulayamazsınız. Taşıma işlemine gidin ve "Yukarı" yönteminin içindeki tüm kodu yorumlayın.

  5. Şimdi update-database'i çalıştırın. Migration uygular (veritabanını değiştirmese de) ve MigrationHistory'de bir anlık görüntü satırı oluşturur.

Artık taşıma işlemlerinizi sıfırladınız ve normal taşıma işlemlerine devam edebilirsiniz.


11
Benim için işe yarayan tek cevap bu. Kabul edilen yanıt, Update-Database'i çalıştırdığınızda veya uygulamanızı çalıştırdığınızda (ne tür bir başlatıcı kullandığınıza bağlı olarak) ne olduğu sorununu ele almıyor gibi görünüyor. Taşıma işlemini çalıştırmaya ve zaten var olan değişiklikleri yapmaya çalışacaktır. Bir şey eksik olmadıkça.
2014

2
Aynı zamanda daha esnek olan cevap. Benim durumumda, uygulamam gereken bazı değişiklikler vardı, bazıları uygulanmadı. Yararlı şeyleri Up () içinde tutabilirdim.
tec-goblin

1
@ H.Johnson, baktım. Bununla ilgili bir sorunuz mu var?
Greg Gum

2
Dikkat edilmesi gereken bir şey, EF 6.0'dan _MigrationsHistory tablosu birden çok DBContext için taşıma içerir. Bunu silmek sorunlara neden olabilir, yalnızca ContextKey = taşıma adınız olan satırları silmelisiniz. Ayrıca yukarıdaki 2'den sonra tekrar göç etmek zorunda kaldım
David Waterworth

2
Temel olarak aynı cevap, genişletilmiş bir örnekle (ekran görüntüleri ile): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

Peki ya

Update-Database TargetMigration: $InitialDatabase

Manager Console'da mı? Tüm güncellemeleri erken durumuna sıfırlamalıdır.

Referans bağlantısı: İlk Kod Geçişleri - Belirli bir Sürüme Geçiş (Eski Sürüme Geçiş Dahil)


Sanırım ana hayal kırıklığım, durumu doğru bir şekilde korumak için artık göçlere güvenmiyordu. Ve sonuç olarak sıfırdan başlamak istiyoruz.
Todd

@Todd, tökezledim ve baştan başlamak için geçiş dosyalarını silmem gerektiği her zaman net değildi. Şimdi şu çalışıyor: 1. "Update-Database –TargetMigration: $ InitialDatabase" komutunu kullanarak başlangıca geri dönün. 2. Tüm taşıma dosyalarını kaldırın (yyyyMMddHHmmssx_Name.cs veya .vb kullanılarak adlandırılır) 3. 'add-Migration -Name some_name' öğesini kullanarak güncelleştirmeyi yenileyin. 4. 'update-Database'i kullanarak veritabanınızı etkilemek için güncellemeyi yayınlayın. Umarım sizin için çalışır.
Chris Voon

Benim durumumda, bu cevapta önerilen komut SQL hatalarıyla sonuçlandı.
Justin Skiles

"InitialDatabase" ne anlama geliyor? DB'de oluşturulmuş tabloları veya sütunları silecek mi?
Serge

16

Bunu düzeltmek için şunları yapmanız gerekir:

  1. Taşıma Klasöründeki tüm * .cs dosyalarını silin.

  2. Veritabanındaki _MigrationHistory Tablosunu silme

  3. Çalıştırmak Enable-Migrations -EnableAutomaticMigrations -Force

  4. Çalıştırmak Add-Migration Reset

Ardından, public partial class Reset : DbMigrationsınıfta mevcut ve mevcut tüm Tabloları yorumlamanız gerekir:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Bu biti kaçırırsanız hepsi başarısız olur ve tekrar başlamanız gerekir!

  1. Şimdi Çalıştır Update-Database -verbose

Yukarıdakileri doğru bir şekilde yaptıysanız bu başarılı olmalı ve şimdi normal şekilde devam edebilirsiniz.


2
Her şeyi yorumlamak yerine "return" yazabilirsiniz. yöntemin ilk satırında Up ().
chainstair

6

.NET Core'da EF aradığımızda bunun hala ortaya çıktığı düşünüldüğünde, cevabımı buraya göndereceğim (Bu beni çok rahatsız etti). EF 6 .NET sürümünde bazı inceliklerin olduğunu unutmayın (İlk komut yok ve "Anlık Görüntü" dosyalarını silmeniz gerekecek)

(.NET Core 2.1'de test edilmiştir)

İşte adımlar:

  1. _efmigrationhistoryTabloyu silin .
  2. İçeren dosyaları için tüm çözüm için ara Anlık gibi kendi adlarına, ApplicationDbContextSnapshot.csve silmek onları.
  3. Çözümünüzü yeniden oluşturun
  4. Çalıştırmak Add-Migration InitialMigration

Lütfen dikkat: TÜM Anlık Görüntü dosyalarını silmelisiniz . Ben sadece veritabanını silmek için sayısız saat geçirdim ... Bunu yapmazsanız bu boş bir taşıma oluşturur.

Ayrıca, # 3'te taşıma işleminizi istediğiniz gibi adlandırabilirsiniz.

İşte bazı ek kaynaklar: asp.net CORE Boş oluşturulan taşıma işlemleri

Entity Framework 7 taşımalarını sıfırla


3

EntityFramework 6'da lütfen deneyin:

Add-Migration Initial

İlk taşıma dosyasını güncellemek için.


3

Varlık Çerçevesi Çekirdeğinde.

  1. Taşıma klasöründeki tüm dosyaları kaldırın.
  2. Konsola yazın

dotnet ef veritabanı bırakma -f -v

dotnet ef taşıma işlemleri ilk ekle

dotnet ef veritabanı güncellemesi


2

Benim sorunum, el ile taşıma klasörü kaldırıldı olduğu ortaya çıktı. Bunu yaptım çünkü içeriği yedeklemek istedim, bu yüzden klasörü projenin dışına sürükledim. Daha sonra sorunu (bir yedek kopya oluşturduktan sonra) geri koyarak, ardından Çözümler Gezgini'nde sağ tıklayıp açılır menüden Sil'i seçerek Taşıma klasörünü kaldırarak sorunu çözdüm.


1

EF6'da

  1. 'Taşıma' klasöründeki tüm dosyalarınızı silin ... Ancak 'ilk oluşturma' veya 'yapılandırma' değil.
  2. Veritabanını silin.
  3. Şimdi koş Add-Migration Initial.
  4. Şimdi 'güncelleme-veritabanı' yapabilirsiniz ve hepsi iyi olacak.

1

SilMigrations Klasör, Cleandaha sonra Rebuildprojeyi. Bu benim için çalıştı. Temizle ve Yeniden Oluşturmadan önce, önbelleğe alınmış belleğinden beri Taşımanın zaten var olduğunu söylüyordu, henüz silinmedi.


0

Bu yöntem __MigrationHistorytablonun silinmesini gerektirmez , bu yüzden konuşlandırma sırasında ellerinizi veritabanına koymanız gerekmez.

  1. Mevcut taşıma işlemlerini Taşıma işlemleri klasöründen silin.
  2. Paket Yöneticisi Konsolu'nda çalıştır Add-Migration ResetMigrations
  3. Up()Yöntemdeki temiz geçiş geçmişi :
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

Net Core 3.0'da:

Taşıma İşlemlerini Sıfırlamanın bir yolunu bulamadım .

Ayrıca kırılan göçlerle ilgili sorunlar yaşadım ve burada verilen cevaplar benim için işe yaramadı. Bir .Net Core 3.0 web API'm var ve geçen ay bir yerde veritabanını doğrudan düzenledim. Evet, kötü, kötü bir şey yaptım.

Burada önerilen stratejiler Paket Yöneticisi Konsolu'nda bir dizi hatayla sonuçlandı:

  • Bu adda bir taşıma zaten var
  • Anlık görüntü bulunamadı
  • 'Kuvvet' tanınan bir parametre değil

Verilmiş, bir adımı atlamış olabilirim ya da doğru dosyaları temizlemeyi kaçırmış olabilirim, ancak bunu çok kaba bir kuvvet olmadan temizlemenin yolları olduğunu buldum:

  • Her bir geçiş için PMC'den, oluşturma işleminin tersine sırayla, bozuk geçişe kadar ve dahil olmak üzere PMC'den Kaldırma-Taşıma
  • Geçerli şemaya kadar son iyi taşıma arasındaki delta olacak yeni bir taşıma oluşturmak için Add-Migration

Artık web API'sı boş bir veritabanı ile başlatıldığında, varlık modellerine uyacak şekilde tüm tabloları ve özellikleri doğru bir şekilde oluşturur.

HTH!


0

GÜNCELLEME 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Bağlamınız.


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.