Saya menggunakan EF 6.0 untuk proyek saya di C # dengan migrasi dan pembaruan manual. Saya memiliki sekitar 5 migrasi pada basis data, tetapi saya menyadari bahwa migrasi terakhir buruk dan saya tidak menginginkannya. Saya tahu bahwa saya dapat mengembalikan ke migrasi sebelumnya, tetapi ketika saya menambahkan migrasi baru (tetap) dan menjalankan Pembaruan-Database, bahkan migrasi buruk pun diterapkan.
Saya mencoba untuk mengembalikan ke migrasi sebelumnya dan menghapus file dengan migrasi buruk. Tetapi kemudian, ketika saya mencoba untuk menambahkan migrasi baru, saya mendapatkan kesalahan saat memperbarui database, karena file migrasi rusak (lebih khusus, baris kode pertama mengubah nama tabel A ke B dan baris berikutnya, EF sedang mencoba untuk memperbarui tabel dengan nama A - mungkin itu adalah beberapa bug EF).
Apakah ada beberapa pertanyaan yang dapat saya jalankan, yang akan memberi tahu EF sesuatu seperti "Lupakan migrasi terakhir seperti itu tidak pernah ada, itu buruk"? Sesuatu seperti Remove-Migration.
Sunting1
Saya menemukan solusi yang cocok untuk saya. Mengubah model ke kondisi baik dan jalankan Add-Migration TheBadMigration -Force
. Ini akan mengatur ulang migrasi terakhir, bukan yang diterapkan.
Bagaimanapun, ini masih belum menjawab pertanyaan asli sepenuhnya. Jika saya UpdateDatabase ke migrasi buruk, saya tidak menemukan cara yang baik bagaimana mengembalikan dan membuat migrasi baru, kecuali yang buruk.
Terima kasih
sumber
Jawaban:
Anda memiliki 2 opsi:
Anda dapat mengambil Down dari migrasi buruk dan memasukkannya ke dalam migrasi baru (Anda juga perlu membuat perubahan selanjutnya pada model). Ini secara efektif bergulir ke versi yang lebih baik.
Saya menggunakan opsi ini pada hal-hal yang telah pergi ke beberapa lingkungan.
Opsi lainnya adalah benar-benar menjalankan
Update-Database –TargetMigration: TheLastGoodMigration
terhadap basis data yang Anda gunakan dan kemudian menghapus migrasi dari solusi Anda. Ini agak alternatif hulk smash dan mengharuskan ini dilakukan terhadap database yang digunakan dengan versi yang buruk.Catatan: untuk mengatur ulang migrasi yang dapat Anda gunakan
Add-Migration [existingname] -Force
. Namun ini akan menimpa migrasi Anda yang sudah ada, jadi pastikan untuk melakukan ini hanya jika Anda telah menghapus migrasi yang ada dari database. Ini melakukan hal yang sama seperti menghapus file migrasi yang ada dan menjalankannyaadd-migration
Saya menggunakan opsi ini saat mengembangkan.
sumber
Karena pertanyaan menunjukkan ini berlaku untuk migrasi di lingkungan tipe pengembangan yang belum dirilis.
Masalah ini dapat dipecahkan dalam langkah-langkah ini: pulihkan basis data Anda ke migrasi baik terakhir, hapus migrasi buruk dari proyek Entity Framework Anda, hasilkan migrasi baru dan terapkan ke database. Catatan: Dilihat dari komentar, perintah yang tepat ini mungkin tidak lagi berlaku jika Anda menggunakan EF Core.
Langkah 1: Kembalikan ke migrasi sebelumnya
Jika Anda belum menerapkan migrasi Anda, Anda dapat melewati bagian ini. Untuk mengembalikan skema database Anda ke masalah poin sebelumnya, perintah Update-Database dengan opsi -TargetMigration menentukan migrasi baik terakhir. Jika kode kerangka kerja Anda berada di proyek yang berbeda dalam solusi Anda, Anda mungkin perlu menggunakan opsi '-Proyek' atau mengganti proyek default di konsol manajer paket.
Untuk mendapatkan nama migrasi baik terakhir, gunakan perintah 'Dapatkan-Migrasi' untuk mengambil daftar nama migrasi yang telah diterapkan ke database Anda.
Daftar ini menunjukkan migrasi yang diterapkan paling baru terlebih dahulu. Pilih migrasi yang terjadi dalam daftar setelah yang ingin Anda downgrade, yaitu yang diterapkan sebelum yang Anda ingin downgrade. Sekarang keluarkan Update-Database.
Semua migrasi yang diterapkan setelah yang ditentukan akan diturunkan peringkatnya agar dimulai dengan migrasi terbaru yang diterapkan terlebih dahulu.
Langkah 2: Hapus migrasi Anda dari proyek
Jika
remove-migration
perintah tidak tersedia di versi Entity Framework Anda, hapus file migrasi yang tidak diinginkan folder 'Migrasi' proyek EF Anda secara manual. Pada titik ini, Anda bebas untuk membuat migrasi baru dan menerapkannya ke database.Langkah 3: Tambahkan migrasi baru Anda
Langkah 4: Terapkan migrasi Anda ke database
sumber
add-migration "new migration"
,update-database
Bagi mereka yang menggunakan EF Core dengan ASP.NET Core v1.0.0 Saya memiliki masalah yang sama dan menggunakan perintah berikut untuk memperbaikinya (posting @ DavidSopko menunjuk saya ke arah yang benar, tetapi detailnya sedikit berbeda untuk EF Core) :
Sebagai contoh, dalam perkembangan saya saat ini perintah menjadi
Remove-Migration akan menghapus migrasi terakhir yang Anda lamar. Jika Anda memiliki skenario yang lebih kompleks dengan beberapa migrasi untuk dihapus (saya hanya punya 2, yang awal dan yang buruk), saya sarankan Anda menguji langkah-langkah dalam proyek dummy.
Saat ini tampaknya tidak ada perintah Get-Migrations di EF Core (v1.0.0) sehingga Anda harus melihat di folder migrasi Anda dan memahami apa yang telah Anda lakukan. Namun, ada perintah bantuan yang bagus:
Menyegarkan dastabase di VS2015 SQL Server Object Explorer, semua data saya terpelihara dan migrasi yang ingin saya kembalikan hilang :)
Awalnya saya mencoba Remove-Migration dengan sendirinya dan menemukan perintah error membingungkan:
Sudah ada saran untuk meningkatkan kata-kata ini, tapi saya ingin kesalahan mengatakan sesuatu seperti ini:
Output dari perintah bantuan EF Core berikut:
sumber
Anda juga bisa menggunakan
Ini akan mengembalikan dan menghapus migrasi terapan terakhir
sumber
Pertama, Perbarui migrasi sempurna terakhir Anda melalui perintah ini:
Contoh:
Dan, kemudian hapus migrasi Anda yang tidak digunakan secara manual.
sumber
Update-Database 20180906131107_xxxx_xxxx
(tanpa tanda hubung) bekerja untuk saya. Tidak ada versiTargetMigration
sebagai saklar yang berfungsi. Perintah-perintah ini tampaknya menjadi target yang bergerak (yaitu mengubahnya di setiap versi)?Pada .NET Core 2.2,
TargetMigration
tampaknya hilang:Jadi ini bekerja untuk saya sekarang:
Serta (tidak ada
-Migration
saklar):Pada catatan tambahan, Anda tidak lagi dapat menghapus folder migrasi tanpa menyinkronkan Snapshot Model Anda. Jadi jika Anda mempelajari ini dengan cara yang sulit dan berakhir dengan migrasi kosong di mana Anda tahu harus ada perubahan, Anda dapat menjalankan (tidak ada switch yang diperlukan untuk migrasi terakhir):
Ini akan membersihkan kekacauan dan mengembalikan Anda ke tempat yang Anda inginkan, meskipun folder migrasi terakhir dihapus secara manual.
sumber
Untuk EF 6, ini adalah one-liner jika Anda banyak merancah dalam pengembangan. Cukup perbarui vars lalu terus gunakan panah atas di konsol manajer paket untuk membilas dan mengulangi.
Mengapa ini perlu Anda tanyakan? Tidak yakin versi EF6 mana yang berlaku, tetapi jika target migrasi baru Anda telah diterapkan, maka gunakan '-Paksa' untuk kembali scaffold di Add-Migration tidak akan benar-benar scaffold, tetapi sebaliknya membuat file baru (ini bagus Hal itu karena Anda tidak ingin kehilangan 'Down' Anda). Cuplikan di atas melakukan 'Down' terlebih dahulu jika perlu maka -Force berfungsi dengan baik untuk kembali scaffold.
sumber