Ini terlihat seperti tugas yang sangat umum, tetapi saya tidak dapat menemukan cara mudah untuk melakukannya.
Saya ingin membatalkan migrasi terapan terakhir. Saya akan mengharapkan perintah sederhana, seperti
PM> Update-Database -TargetMigration:"-1"
Alih-alih, yang bisa saya pikirkan hanyalah:
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
(Setidaknya aku bisa menggunakan nama saja, melewatkan stempel waktu ...)
Apakah ada cara yang lebih mudah?
entity-framework
entity-framework-4
database-migration
ef-migrations
Cristian Diaconescu
sumber
sumber
Jawaban:
Pada EF 5.0, pendekatan yang Anda gambarkan adalah cara yang disukai. Begitu
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
atau menggunakan contoh migrasi Anda
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
Salah satu solusinya adalah dengan membuat skrip PS wrapper yang mengotomatiskan langkah-langkah di atas. Selain itu, jangan ragu untuk membuat permintaan fitur untuk ini, atau lebih baik lagi, cobalah menerapkannya! https://github.com/dotnet/ef6
sumber
dotnet ef database update LastGoodMigration
namun, ini tampaknya membingungkan karena saya berasal dari latar belakang simpul dan menggunakan knex, sequlize, mereka memiliki perintah untuk mengembalikan perubahan terakhir, apakah ada perintah untuk mengembalikan tindakan terakhir yang diterapkan pada database ?Saya ingin menambahkan beberapa klarifikasi ke utas ini:
Apa yang Anda lakukan di atas adalah mengatakan bahwa Anda ingin mengembalikan semua migrasi SAMPAI Anda tinggal dengan migrasi yang ditentukan. Jadi, jika Anda menggunakan MENDAPATKAN MIGRASI dan Anda menemukan bahwa Anda memiliki A, B, C, D, dan E, maka menggunakan perintah ini akan mengembalikan E dan D untuk membawa Anda ke C:
Juga, kecuali ada yang bisa berkomentar sebaliknya, saya perhatikan bahwa Anda dapat menggunakan nilai ordinal dan pendek -Target beralih (dengan demikian, -Target adalah sama dengan -TargetMigrasi). Jika Anda ingin mengembalikan semua migrasi dan memulai kembali, Anda dapat menggunakan:
0, di atas, akan mengembalikan bahkan migrasi PERTAMA ( ini adalah perintah yang merusak - pastikan Anda tahu apa yang Anda lakukan sebelum Anda menggunakannya! ) - sesuatu yang tidak dapat Anda lakukan jika Anda menggunakan sintaks di atas yang memerlukan nama migrasi target (nama migrasi ke-0 tidak ada sebelum migrasi diterapkan!). Jadi dalam hal ini, Anda harus menggunakan nilai 0 (ordinal). Demikian juga, jika Anda telah menerapkan migrasi A, B, C, D, dan E (dalam urutan itu), maka ordinal 1 harus merujuk ke A, ordinal 2 harus merujuk ke B, dan seterusnya. Jadi untuk mengembalikan ke B Anda dapat menggunakan:
atau
Edit Oktober 2019:
Menurut jawaban terkait ini pada pertanyaan serupa, perintah yang benar adalah
-Target
untuk EF Core 1.1 sementara-Migration
untuk EF Core 2.0.sumber
$InitialDatabase
.ls variable:*
sepertinya$InitialDatabase
hanyalah variabel PowerShell yang didefinisikan sebagai 0, tidak ada yang lain yang didefinisikan, bahkan dalam kode sumber EF saat ini. Dan, dapatkan migrasi tidak mengembalikan apa pun, itu hanya menulis ke konsol, sehingga Anda tidak dapat beralih pada objek yang dikembalikan ...Di EntityFrameworkCore :
ke mana
20161012160749_AddedOrderToCourse
nama migrasi yang ingin Anda kembalikan.sumber
Solusinya adalah:
sumber
Pengingat tambahan:
Jika Anda memiliki beberapa jenis konfigurasi, Anda perlu menentukan [ConfigurationName]
sumber
Di EF Core Anda dapat memasukkan perintah
Remove-Migration
di konsol manajer paket setelah menambahkan migrasi yang salah.Konsol menyarankan Anda melakukannya jika migrasi Anda dapat melibatkan hilangnya data:
sumber
Peringatan : Ini akan mengembalikan SEMUA migrasi di EFCore! Silakan gunakan dengan hati-hati :)
sumber
Saya menemukan bahwa ini berfungsi ketika dijalankan di Package Manager Console:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Anda dapat membuat skrip yang membuatnya lebih mudah.
sumber
Saya menggunakan EntityFrameworkCore dan saya menggunakan jawabannya oleh @MaciejLisCK. Jika Anda memiliki beberapa konteks DB, Anda juga perlu menentukan konteks dengan menambahkan parameter konteks misalnya:
Update-Database 201207211340509_MyMigration -context myDBcontext
(di mana
201207211340509_MyMigration
migrasi yang ingin Anda putar kembali, danmyDBcontext
merupakan nama konteks DB Anda)sumber
Untuk masalah ini saya sarankan tautan ini:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
sumber
Jika ada kemungkinan untuk dataloss, EF tidak menyelesaikan perintah pembaruan-basis data karena AutomaticMigrationDataLossAllowed = false secara default, dan roolbacks tindakan kecuali jika Anda menjalankannya dengan parameter -force .
atau
sumber