EF Core ile ASP.NET Core'da taşıma nasıl kaldırılır


181

PM> Remove-Migration -context BloggingContextEF Core kullanarak bir ASP.NET Core projesiyle VS2015'te çalıştırdığımda aşağıdaki hatayı alıyorum:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

Nasıl kaldırabilirim? ASP.NET Core 1.0, EF Core ve VS2015 Güncelleme 3'ün en son sürümünü kullanıyorum.


3
-forcesonunda eklemeyi deneyin
müstakbel


MichaelFreidgeim
Drewskis

Yanıtlar:


219

kullanın:

CLI

> dotnet ef database update <previous-migration-name>

Paket Yöneticisi Konsolu

PM> Update-Database <previous-migration-name>

Misal:

PM> Update-Database MyInitialMigration

Ardından son geçişi kaldırmayı deneyin.

Veritabanında değişiklik uyguladığınız için veritabanı güncellemesi olmadan taşıma işlemini kaldırmak işe yaramaz.

PMC kullanıyorsanız, Deneyin: PM> update-database 0 Bu, veritabanını siler ve Çözümünüzdeki Geçiş Anlık Görüntüsünü kaldırmanıza olanak tanır


6
Hala aynı hatayı alıyorum. İlk dotnet ef database update MyFirstMigration --context BloggingContextönce başarılı bir şekilde çalıştı. Sonra ben dotnet ef migrations remove --context BloggingContextde benim yazı ile aynı hata mesajını verdi koştu
nam

14
Daha önce taşımayı güncellemeniz gerekir MyFirstMigration. Bu 1. taşıma (adından da anlaşılacağı gibi) dotnet ef database update 0ise, veritabanından tüm taşıma işlemlerini geri almak (uygulamasını kaldırmak) için kullanabilirsiniz . Daha sonra koşabilmelisin dotnet ef migrations remove.
bvpb

Ayrıca, tarih öneki hariç yalnızca taşıma adını kullanmanız gerektiğini belirtmek gerekir
Yapılandırılmış

2
Bundan dotnet ef migrations removesonra ara
Chamika Sandamal

İkinci ifadeniz: "Öyleyse son taşıma işlemini kaldırmaya çalışın" bu yanıtta tamamlanmadı, lütfen tam olarak ne demek istediğinizi söyleyin. taşıma dosyası kaldırılsın mı? komut çalıştırılsın mı? ...
S.Serpooshan

125

Tüm taşıma işlemlerini tamamen kaldırmak ve baştan başlamak için aşağıdakileri yapın:

dotnet ef database update 0
dotnet ef migrations remove

1
Ancak tüm taşıma işlemlerini kaldırmak istemezsiniz. Örneğin, VS'nin kimlik için oluşturduğu varsayılan taşımayı (Kullanıcı Hesapları) Data \ Migrations klasörü altında tutmak istersiniz.
nam

Bilmek iyidir dotnet ef database update 0, ancak dotnet ef migrations removedaha sonra çalıştırmak Kimlik için varsayılan geçişi kaldıracaktır, bu da istenmeyebilir.
kimbaudi

Bahşiş için teşekkürler dotnet ef database update 0! Bunu hiçbir yerde söylememiştim ...
Tobias J

3
@nam "Ancak tüm taşıma işlemlerini kaldırmak istemiyorsunuz." Ama bazılarımız yapıyor. Ne istediğimi varsaymayın :)
starmandeluxe

3
Bu benim için işe yaramadı. İlk satır iyiydi ve tüm göçleri kaldırıyorum, ikinci satırda hala alıyorumThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran

53

Belirli bir taşıma işleminin uygulamalarını kaldırmak için :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Tüm taşıma işlemlerini kaldırmak için :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Son taşımayı kaldırmak için:

dotnet ef migrations remove
or
PM> Remove-Migration

Tüm taşıma işlemlerini kaldırmak için:

sadece Migrationsklasörü kaldırın .

Son birkaç taşımayı kaldırmak için (tümü değil):

Bir grup geçişi kaldırma komutu yoktur ve anlık görüntü dosyasını tutarlı durumda tutmamız gerektiğinden bu birkaç dosyayı migrationsve *.designer.csdosyalarını kaldıramayız . Taşıma işlemlerini tek tek kaldırmamız gerekiyor (yukarıya bakın To remove last migration).

Son taşımayı kaldırmak ve kaldırmak için:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

Bu yazılardaki kelimeyi görmeye devam ediyorum unapply. Sadece bana çarptı, teknik bir terim değil, kelimeun - apply
Helzgate

52

Yine de Update-Databasekomutu kullanabilirsiniz .

Update-Database -Migration <migration name> -Context <context name>

Ancak, göçünüzün adıyla değerlendirildiğinde, komutun çalışmayabileceği ilk geçiş olduğunu varsayıyorum. Girdiyi __MigrationHistoryveritabanınızdaki tablodan silebilmeniz ve sonra Remove-Migrationkomutu yeniden çalıştırabilmeniz gerekir . Ayrıca taşıma dosyasını silebilir ve yeniden başlayabilirsiniz.


Sen diyebilirsin Update-DatabasePaket Yönetim konsolunu veya çağrı dotnet ef database updateproje dizinden komut isteminden.
kimbaudi

7
Sadece burada Brad'in cevabı netleştirmek - <migration name>Eğer istediğiniz göçün adı olmalıdır dönmek (yani muhtemelen göç önce sen berbat biri) Geri almak istediğiniz göç değil, ismi.
Mark Amery

28

Uygulanan son geçişi geri almak için (paket yöneticisi konsolu komutları):

  1. Veritabanından taşıma işlemini geri alma: PM> Update-Database <prior-migration-name>
  2. Taşıma dosyasını projeden kaldır (veya bir sonraki adımda tekrar uygulanır)
  3. Model anlık görüntüsünü güncelleme: PM> Remove-Migration

UPD : İkinci adım, Visual Studio'nun (2017) en son sürümlerinde gerekli görünmüyor.


1
Teşekkür ederim! Bu mükemmel bir şekilde çalıştı Tüm çözümlerden hiç kimsenin 2. adıma ihtiyaç
duymadığından çok etkilendi

Evet, kimse ikinci adımdan bahsetmedi.Teşekkür ederiz
Ajas Aju

ikinci adımdan emin değilim, benim durumumda (en son VS2017) geçiş dosyası Remove-Migrationsorunsuz çağrıldıktan sonra otomatik olarak silinecek . "Bir sonraki adımda tekrar uygulanacak" dediğinden emin değilim!
S.Serpooshan

@ S.Serpooshan Gerçekten. Manuel olarak sildim ancak Remove-Migration'ı çalıştırdığımda, önceki geçişimin veritabanına uygulandığından şikayet etti. Ama işe yarıyor.
MetalMikester

Sanırım ikinci adım sadece dbContext.Database.Migrate()startup.cs
dosyasını

23

Bir Taşıma işlemini değere göre hedefleyebilirsiniz

 Update-Database -Migration:0

Sonra devam et ve kaldır

 Remove-Migration

1
Bu benim için çalıştı ama VS2017 ile EF ve .NET core 2.0 kullanıyorum
James Morrison

2
Dikkat: -Göçmenlik: 0, göç olmadan devlete geri dönmek anlamına gelir. Bu, veri tabanınızı temizleyecek
Kieren Johnstone

Sorulan soruya göre evet. Geri almak istediğiniz geçişe bağlı olarak değeri
artırabilirsiniz

11

Veritabanına uygulandıktan sonra en son (en son?) Geçişi "kaldırmak" için:

  1. SQL Server Nesne Gezgini'ni açın (Görünüm -> "SQL Server Nesne Gezgini")
  2. Küçük üçgenleri yana genişleterek projenize bağlı veritabanına gidin.
  3. "Tablolar" ı genişletin
  4. "Dbo._EFMigrationsHistory" adlı tabloyu bulun.
  5. Visual Studio'da tablo girişlerini görmek için sağ tıklayın ve "Verileri Görüntüle" yi seçin.
  6. Uygulamanızı kaldırmak istediğiniz taşıma işlemine karşılık gelen satırı silin (istenirse uyarıya "evet" deyin).
  7. Project.json dosyasını içeren dizindeki komut penceresinde "dotnet ef migrations remove" komutunu yeniden çalıştırın. Alternatif olarak, paket yöneticisi konsolunda "Kaldır-Migration" komutunu çalıştırın.

Umarım bu yardımcı olur ve projedeki herhangi bir göç için geçerlidir ... Bunu sadece en son göç için test ettim ...

Mutlu kodlama!


21
Bu aslında göçü kaldırmayacak, sadece çerçevenin uygulanmadığını "düşünmesini" sağlayacaktır. Bunu yaparsanız veritabanınız tutarsız bir durumda olacaktır.
mark.monteiro

__EFMigrationsHistory'nizdeki verileri manuel olarak düzenlemek korkunç bir tavsiye. Yapma. Bu tablonun yalnızca taşıma araçları tarafından kaputun altında kullanılması amaçlanmıştır. Verileri manuel olarak düzenlemeye başlarsanız, tek bir hata projenizde her türlü çılgın beklenmedik davranış oluşturabilir. Önerilen diğer çözümlerden birini kullanmak çok daha iyi bir fikirdir.
Joe Irby

Küçük bir ekip üyesinin şubeleri değiştirmekle karıştığı ve her ikisinden de manuel olarak taşıma işlemini sonlandırdığımız bir durum vardı (zaten uygulandığından beri hala __EFMigrationsHistory tablosunda olmasına rağmen), "aşağı" yı kaybettik. Sonuçta SSMS'de bazı manuel geri dönüşler yaptık. Öyleyse yapmayın - bu noktada başka seçeneğiniz yoksa. En azından yaptığı tek şey yeni bir alan eklemekti.
Ella


10

Taşınma silmelisiniz '20160703192724_MyFirstMigration' dan rekoru '_EFMigrationsHistory' masaya.

aksi halde bu komut taşıma işlemini kaldırır ve taşıma klasörünü siler:

   > remove-migration -force

7

Genel olarak Paket Yöneticisi Konsolu'nu kullanıyorsanız, belirli bir Geçişi kaldırmanın doğru yolu geçişin adına başvurarak

Update-Database -Migration {Name of Migration} -Context {context}

Dokümanlara göre uyguladığınız son geçişi kaldırmanın başka bir yolu şu komutu kullanmaktır:

dotnet ef migrations remove

Bu komut , çözüm dizininizdeki geliştirici komut isteminden (komut isteminin nasıl açılacağı ) yürütülmelidir .

Örneğin, uygulamanız "Application" adının içindeyse ve c: \ Projects klasöründeyse. O zaman yolunuz:

C:\Projects\Application

1
Soru, "dotnet ef migration remove 'bir hata döndürürse ne yapılacağıydı" Geçiş zaten veritabanına uygulandı "
Michael Freidgeim

2

EF Core 1.0'da bir geçişin uygulamasını kaldırmak için şu komutu kullanın:

dotnet ef veritabanı güncellemesi {migration_name}

Değişikliklerinizi korumak istediğiniz taşıma işleminin taşıma adını kullanın. Taşıma adlarının listesi aşağıdakiler kullanılarak bulunabilir:

dotnet ef taşıma listesi


2

DB'ye uygulanan tüm geçişleri geri almak için şunu çalıştırın:

update-database 0

Bunu Remove-Migration, Migration dizininde görünen geçiş dosyaları olduğu kadar çok sayıda çalıştırma ile takip etmelisiniz . Komut en son taşımayı siler ve anlık görüntüyü de günceller.


1

ilk önce aşağıdaki komutu çalıştırın:

PM>update-database -migration:0

ve sonra bunu çalıştırın:

PM>remove_migration

Bitiş


0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1. "dbo._EFMigrationsHistory" tablosunu bulun, ardından kaldırmak istediğiniz taşıma kaydını silin. 2. PM'de (Paket Yöneticisi Konsolu) "remove-migration" komutunu çalıştırın. Benim için çalışıyor.


Bu, veritabanının tutarsız bir durumuna yol açacaktır (örneğin, bir sütun zaten bırakılmıştır)
UNeverNo
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.