Cara menghapus permohonan migrasi di ASP.NET Core dengan EF Core

180

Ketika saya menjalankan PM> Remove-Migration -context BloggingContextVS2015 dengan proyek ASP.NET Core menggunakan EF Core, saya mendapatkan kesalahan berikut:

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.

Bagaimana saya bisa menghapusnya? Saya menggunakan rilis terbaru dari ASP.NET Core 1.0, EF Core, dan VS2015 Update 3.

nam
sumber
3
coba tambahkan -forcedi akhir
prospektor
1
Artikel learnentityframeworkcore.com/migrations#reversing-a-migrasi menjelaskan langkah-langkahnya. Terima kasih @dskskis untuk tautannya
Michael Freidgeim
Terima kasih
@MichaelFreidgeim

Jawaban:

215

Menggunakan:

CLI

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

Paket Pengelola Konsol

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

Contoh:

PM> Update-Database MyInitialMigration

Kemudian cobalah untuk menghapus migrasi terakhir.

Menghapus migrasi tanpa pembaruan basis data tidak berfungsi karena Anda menerapkan perubahan pada basis data.

Jika menggunakan PMC, Coba: PM> perbarui-database 0 Ini akan menghapus basis data dan memungkinkan Anda untuk menghapus Snapshot Migrasi pada Solusi Anda

adem caglin
sumber
6
Saya masih mendapatkan kesalahan yang sama. Saya pertama kali menggunakannya dotnet ef database update MyFirstMigration --context BloggingContextyang berhasil. Kemudian saya berlari dotnet ef migrations remove --context BloggingContextyang memberi saya pesan kesalahan yang sama seperti pada posting saya
nam
14
Anda harus memperbarui migrasi sebelum MyFirstMigration. Jika itu adalah migrasi pertama (sesuai namanya) maka Anda dapat menggunakan dotnet ef database update 0untuk mengembalikan (tidak berlaku) semua migrasi dari database. Anda kemudian harus dapat berlari dotnet ef migrations remove.
bvpb
Juga perlu dicatat bahwa Anda hanya harus menggunakan nama migrasi, tidak termasuk awalan tanggal
Structed
2
Sebut dotnet ef migrations removesetelah ini
Chamika Sandamal
Pernyataan kedua Anda: "Maka cobalah untuk menghapus migrasi terakhir" tidak lengkap dalam jawaban ini, tolong katakan dengan tepat apa yang Anda maksud. hapus file migrasi? menjalankan perintah? ...
S.Serpooshan
125

Untuk sepenuhnya menghapus semua migrasi dan memulai dari awal lagi, lakukan hal berikut:

dotnet ef database update 0
dotnet ef migrations remove
Ronald Ramos
sumber
1
Tetapi Anda tidak ingin menghapus semua migrasi. Misalnya, Anda ingin menyimpan migrasi default yang dibuat VS untuk identitas (Akun Pengguna) di bawah folder Data \ Migrasi.
nam
Itu baik untuk diketahui dotnet ef database update 0, tetapi menjalankannya dotnet ef migrations removesetelah itu akan menghapus migrasi default untuk Identity, yang mungkin tidak diinginkan.
kimbaudi
Terima kasih atas tipnya dotnet ef database update 0! Saya belum pernah melihat ini disebutkan di mana saja ...
Tobias J
3
@nam "Tapi Anda tidak ingin menghapus semua migrasi." Tetapi beberapa dari kita melakukannya. Jangan berasumsi apa yang saya inginkan :)
starmandeluxe
3
Ini tidak berhasil untuk saya. Baris pertama ok dan menghapus semua migrasi, pada baris kedua saya masih mendapatkanThe 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
52

Anda masih dapat menggunakan Update-Databaseperintah.

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

Namun, menilai dari nama migrasi Anda, saya berasumsi ini adalah migrasi pertama sehingga perintah itu mungkin tidak berfungsi. Anda harus dapat menghapus entri dari __MigrationHistorytabel di database Anda dan kemudian jalankan Remove-Migrationperintah itu lagi. Anda juga dapat menghapus file migrasi dan mulai lagi.

Brad
sumber
Anda dapat menelepon Update-Databasedari Package Management Console atau menelepon dotnet ef database updatedari command prompt dari direktori proyek.
kimbaudi
7
Hanya untuk memperjelas jawaban Brad di sini - <migration name>harus merupakan nama dari migrasi Anda ingin kembali ke (yaitu mungkin migrasi sebelum salah satu yang kacau), bukan nama migrasi Anda ingin membatalkan.
Mark Amery
52

Untuk membatalkan permohonan migrasi tertentu :

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

Untuk membatalkan permohonan semua migrasi :

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

Untuk menghapus migrasi terakhir:

dotnet ef migrations remove
or
PM> Remove-Migration

Untuk menghapus semua migrasi:

hapus saja Migrationsfolder.

Untuk menghapus beberapa migrasi terakhir (tidak semua):

Tidak ada perintah untuk menghapus banyak migrasi dan kami tidak bisa hanya menghapus beberapa ini migrationsdan *.designer.csfile - file mereka karena kami perlu menjaga file snapshot dalam keadaan konsisten. Kami perlu menghapus migrasi satu per satu (lihat di To remove last migrationatas).

Untuk membatalkan permohonan dan menghapus migrasi terakhir:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
AlbertK
sumber
Saya terus melihat kata di unapplyseluruh posting ini. Itu hanya memukul saya itu bukan istilah teknis, itu kataun - apply
Helzgate
28

Untuk mengembalikan migrasi yang diterapkan terakhir Anda harus (perintah konsol manajer paket):

  1. Kembalikan migrasi dari basis data: PM> Update-Database <prior-migration-name>
  2. Hapus file migrasi dari proyek (atau akan diterapkan kembali pada langkah berikutnya)
  3. Perbarui snapshot model: PM> Remove-Migration

UPD : Langkah kedua tampaknya tidak diperlukan di versi terbaru Visual Studio (2017).

Dmitry Polomoshnov
sumber
1
Terima kasih! Ini bekerja dengan sangat terpesona bahwa dari semua solusi yang tidak seorang pun pernah menyebutkan perlunya langkah 2.
Michael Kargl
Yeh, Tidak ada yang menyebutkan langkah kedua. Terima kasih
Ajas Aju
tidak yakin tentang langkah kedua, dalam kasus saya (VS2017 terbaru) file migrasi akan dihapus secara otomatis setelah menelepon Remove-Migrationtanpa masalah. Saya tidak yakin apa yang Anda katakan "itu akan diterapkan kembali pada langkah selanjutnya"!
S.Serpooshan
@ S.Serpooshan Memang. Saya menghapusnya secara manual tetapi ketika saya menjalankan Remove-Migration, ia mengeluh tentang migrasi saya sebelumnya yang telah diterapkan ke database. Tapi itu berhasil.
MetalMikester
Langkah kedua yang saya pikir hanya perlu jika Anda memanggil dbContext.Database.Migrate()startup.cs Anda
user3413723
23

Cukup Anda dapat menargetkan Migrasi berdasarkan nilai

 Update-Database -Migration:0

Lalu, lanjutkan dan hapus

 Remove-Migration
John Nyingi
sumber
1
Ini bekerja untuk saya tetapi saya menggunakan EF dan .NET core 2.0 dengan VS2017
James Morrison
2
Hati-hati: -Migrasi: 0 berarti kembali ke negara tanpa migrasi. Ini akan menghapus basis data Anda
Kieren Johnstone
Ya sesuai dengan pertanyaan yang diajukan. Anda dapat menambah nilainya tergantung pada migrasi yang ingin Anda putar kembali
John Nyingi
11

Untuk "membatalkan permohonan" migrasi paling banyak (baru-baru ini?) Setelah migrasi diterapkan ke database:

  1. Buka SQL Server Object Explorer (Lihat -> "SQL Server Object Explorer")
  2. Arahkan ke database yang tertaut ke proyek Anda dengan memperluas segitiga kecil ke samping.
  3. Luaskan "Tabel"
  4. Temukan tabel bernama "dbo._EFMigrationsHistory".
  5. Klik kanan padanya dan pilih "Lihat Data" untuk melihat entri tabel di Visual Studio.
  6. Hapus baris yang sesuai dengan migrasi Anda yang ingin Anda hapuskan (Katakan "ya" untuk peringatan, jika diminta).
  7. Jalankan "dotnet ef migrasi hapus" lagi di jendela perintah di direktori yang memiliki file project.json. Atau, jalankan perintah "Hapus-Migrasi" di konsol manajer paket.

Semoga ini bisa membantu dan berlaku untuk setiap migrasi dalam proyek ... Saya menguji ini hanya untuk migrasi terbaru ...

Selamat coding!

Raj
sumber
21
Ini sebenarnya tidak akan membatalkan migrasi, hanya membuat kerangka kerja "berpikir" itu belum diterapkan. Basis data Anda akan berada dalam kondisi tidak konsisten jika Anda melakukan ini.
mark.monteiro
Mengedit data secara manual di __EFMigrationsHistory Anda adalah nasihat yang mengerikan. Jangan lakukan itu. Tabel itu hanya dimaksudkan untuk digunakan di bawah tenda oleh alat migrasi. Jika Anda mulai mengedit data secara manual, satu kesalahan dapat membuat semua jenis perilaku tak terduga yang gila di proyek Anda. Ini adalah ide yang jauh lebih baik untuk menggunakan salah satu solusi yang direkomendasikan lainnya.
Joe Irby
Kami memiliki situasi di mana anggota tim junior bingung dengan beralih cabang, dan akhirnya menghapus migrasi secara manual dari keduanya (meskipun masih dalam tabel __EFMigrationsHistory sejak itu sudah diterapkan), jadi kami kehilangan "down." Inilah yang akhirnya harus kami lakukan, ditambah beberapa pembalikan manual dalam SSMS. Jadi jangan lakukan itu - kecuali Anda tidak punya pilihan lain pada saat ini. Setidaknya yang dia lakukan adalah menambahkan satu bidang baru.
Ella
10

Anda harus menghapus data migrasi '20160703192724_MyFirstMigration' dari tabel '_EFMigrationsHistory' .

jika tidak , perintah ini akan menghapus migrasi dan menghapus folder migrasi:

   > remove-migration -force
AminGolmahalle
sumber
7

Secara umum jika Anda menggunakan Package Manager Console cara yang tepat untuk menghapus Migrasi tertentu adalah dengan merujuk nama migrasi

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

Cara lain untuk menghapus migrasi terakhir yang telah Anda terapkan sesuai dengan dokumen adalah dengan menggunakan perintah:

dotnet ef migrations remove

Perintah ini harus dijalankan dari command prompt pengembang ( cara membuka command prompt ) di dalam direktori solusi Anda.

Misalnya jika aplikasi Anda ada di dalam nama "Aplikasi" dan ada di folder c: \ Projects. Maka jalan Anda seharusnya:

C:\Projects\Application
Anastasios Selmanis
sumber
1
Pertanyaannya adalah apa yang harus dilakukan jika `dotnet ef migrasi menghapus 'mengembalikan kesalahan" Migrasi telah diterapkan ke database "
Michael Freidgeim
2

Untuk membatalkan permohonan migrasi di EF Core 1.0 gunakan perintah:

pembaruan basis data dotnet ef {migration_name}

Gunakan nama migrasi dari migrasi sampai Anda ingin menyimpan perubahan Anda. Daftar nama migrasi dapat ditemukan menggunakan:

dotnet ef daftar migrasi

Rufus Lobo
sumber
2

Untuk mengembalikan semua migrasi yang diterapkan ke DB jalankan saja:

update-database 0

Ini harus diikuti dengan menjalankan Remove-Migrationsebanyak mungkin file migrasi yang terlihat di direktori Migrasi. Perintah menghapus migrasi terbaru dan juga memperbarui snapshot.

Dipendu Paul
sumber
1

pertama jalankan perintah berikut:

PM>update-database -migration:0

dan kemudian jalankan yang ini:

PM>remove_migration

Selesai

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

await context.Database.EnsureDeletedAsync();
Kishor Gujar
sumber
-1

1.temukan tabel "dbo._EFMigrationsHistory", lalu hapus catatan migrasi yang ingin Anda hapus. 2. jalankan "hapus-migrasi" di PM (Package Manager Console). Bekerja untukku.

Atom
sumber
Ini akan menyebabkan kondisi database yang tidak konsisten (misalnya kolom sudah jatuh)
UNeverNo