Reset Migrasi Entitas-Kerangka

299

Saya telah IgnoreChangesmenghapus migrasi saya, saya gunakan pada migrasi awal, tetapi sekarang saya ingin menghapus semua migrasi saya dan mulai dengan migrasi awal dengan semua logika.

Ketika saya menghapus migrasi di folder dan mencoba dan Add-Migrationtidak menghasilkan file lengkap (itu kosong - karena saya belum membuat perubahan sejak migrasi saya yang terakhir, tetapi sekarang dihapus,).

Apakah ada perintah Disable-Migrations , sehingga saya bisa menjalankan kembali Enable-Migrations?

Todd
sumber
3
Satu catatan penting jika Anda memiliki banyak koneksi: tentukan yang mana yang akan digunakan ketika Anda mengatur ulang migrasi, jika tidak maka akan mencoba untuk menerapkan keduanya yang dapat menyebabkan masalah ketika ada perbedaan.
Jeroen Vannevel
Catatan: Jika Anda belum menghapus migrasi Anda (Anda menggunakan kontrol versi kan?), Anda bisa memperbarui db -untuk migrasi pertama Anda kemudian menghapus mitigasi dan membuat migrasi baru dari titik itu. Lihat di sini: stackoverflow.com/a/23793384/309634
DarcyThomas

Jawaban:

446

Kamu butuh :

  1. Hapus status: Hapus folder migrasi di proyek Anda; Dan
  2. Hapus __MigrationHistorytabel dalam database Anda (mungkin di bawah tabel sistem); Kemudian
  3. Jalankan perintah berikut di Package Manager Console:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Gunakan dengan atau tanpa -EnableAutomaticMigrations

  4. Dan akhirnya, Anda dapat menjalankan:

    Add-Migration Initial
Todd
sumber
5
^^ Mencari tahu - itu adalah kesalahan TFS - jika Anda menggunakan TFS Anda perlu melakukan check-in sebelum menjalankan perintah "Aktifkan-Migrasi ...". : D
BrainSlugs83
7
Jika Anda tidak menggunakan kontrol versi, simpan nilai Seed Anda sebelum Anda menghapus!
RyanJMcGowan
77
@RyanJMcGowan jika Anda tidak menggunakan kontrol versi, Anda layak kehilangan pekerjaan. :-)
Mike Cole
4
@Tood. +1 untuk itu. Menyelamatkan saya banyak waktu. Sekarang jika hanya tim EF yang dapat menggabungkan semua itu ke dalam perintah Reset-Migrasi. Mungkin EF 6 ...
Gerald Davis
24
Untuk basis data yang ada, Anda perlu mengomentari konten fungsi "Naik". Kalau tidak, Anda akan mendapatkan kesalahan ketika Anda menjalankan "Perbarui-Database", itu akan mengeluh bahwa tabel sudah ada
Guy
149

Masalah: Anda telah menghapus migrasi Anda dan Anda ingin mengatur ulang tanpa menghapus tabel yang ada.

Masalahnya: Anda tidak dapat mengatur ulang migrasi dengan tabel yang ada di database karena EF ingin membuat tabel dari awal.

Apa yang harus dilakukan:

  1. Hapus migrasi yang ada dari tabel Migrations_History.

  2. Hapus migrasi yang ada dari Folder Migrasi.

  3. Jalankan Reset tambah migrasi. Ini akan membuat migrasi di folder Migrasi Anda yang termasuk membuat tabel (tetapi tidak akan menjalankannya sehingga tidak akan keluar kesalahan.)

  4. Anda sekarang perlu membuat baris awal di tabel MigrationHistory sehingga EF memiliki snapshot dari kondisi saat ini. EF akan melakukan ini jika Anda menerapkan migrasi. Namun, Anda tidak dapat menerapkan migrasi yang baru saja Anda buat karena tabel sudah ada di database Anda. Jadi pergilah ke Migrasi dan komentar semua kode di dalam metode "Naik".

  5. Sekarang jalankan pembaruan-database. Ini akan menerapkan Migrasi (walaupun tidak benar-benar mengubah database) dan membuat baris snapshot di MigrationHistory.

Anda sekarang telah mengatur ulang migrasi Anda dan dapat melanjutkan dengan migrasi normal.

Greg Gum
sumber
11
Ini satu-satunya jawaban yang berhasil untuk saya. Jawaban yang diterima tampaknya tidak membahas masalah apa yang terjadi ketika Anda menjalankan Pembaruan-Database atau menjalankan aplikasi Anda (tergantung pada jenis inisialisasi yang Anda gunakan). Ini akan mencoba menjalankan migrasi dan mencoba membuat perubahan yang sudah ada. Kecuali saya kehilangan sesuatu.
mengaturarmike
2
Itu juga jawaban yang lebih fleksibel. Dalam kasus saya ada beberapa perubahan yang perlu saya terapkan dan beberapa lainnya tidak. Saya hanya bisa menyimpan hal-hal yang berguna di Up () saya.
tec-goblin
1
@ H. Johnson, saya telah melihatnya. Apakah Anda punya pertanyaan tentang itu?
Greg Gum
2
Satu hal yang perlu diperhatikan, dari EF 6.0 tabel _MigrationsHistory berisi migrasi untuk beberapa DBContexts. Menghapusnya dapat menyebabkan masalah, Anda hanya harus menghapus baris di mana ContextKey = nama migrasi Anda. Juga setelah 2 di atas saya harus mengaktifkan-migrasi lagi
David Waterworth
2
Pada dasarnya jawaban yang sama, dengan contoh yang diperluas (dengan tangkapan layar): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026
30

Bagaimana tentang

Update-Database TargetMigration: $InitialDatabase

dalam Paket Pengelola Konsol? Seharusnya mengatur ulang semua pembaruan ke kondisi paling awal.

Tautan referensi: Migrasi Pertama Kode - Bermigrasi ke Versi Tertentu (Termasuk Downgrade)

Chris Voon
sumber
Saya pikir frustrasi utama saya adalah tidak lagi mempercayai migrasi untuk menjaga keadaan secara akurat. Dan akibatnya ingin memulai dari awal.
Todd
@Todd, saya tersandung dan tidak selalu jelas apakah saya harus menghapus file migrasi untuk memulai dari awal. Sekarang berfungsi sebagai berikut: 1. kembali ke awal menggunakan perintah "Perbarui-Database-TargetMigrasi: $ InitialDatabase". 2. Hapus semua file migrasi (dinamai menggunakan yyyyMMddHHmmssx_Name.cs atau .vb) 3. Refresh pembaruan dengan menggunakan 'add-Migration -Name some_name'. 4. Keluarkan pembaruan untuk memengaruhi database Anda menggunakan 'update-Database'. Semoga ini berhasil untuk Anda.
Chris Voon
Dalam kasus saya, perintah yang disarankan dalam jawaban ini menghasilkan kesalahan SQL.
Justin Skiles
apa artinya "InitialDatabase"? apakah ini akan menghapus tabel atau kolom yang sudah dibuat di DB?
Serge
16

Untuk memperbaikinya, Anda harus:

  1. Hapus semua file * .cs di Folder Migrasi.

  2. Hapus Tabel _MigrationHistory di Database

  3. Lari Enable-Migrations -EnableAutomaticMigrations -Force

  4. Lari Add-Migration Reset

Kemudian, di public partial class Reset : DbMigrationkelas, Anda perlu mengomentari semua Tabel yang ada dan saat ini:

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

Jika Anda melewatkan sedikit ini semua akan gagal dan Anda harus memulai lagi!

  1. Sekarang Jalankan Update-Database -verbose

Ini harus berhasil jika Anda telah melakukan hal di atas dengan benar, dan sekarang Anda dapat melanjutkan seperti biasa.

paku berkarat
sumber
2
Alih-alih mengomentari semuanya, Anda juga bisa menulis "kembali;" di baris pertama metode Up ().
chainstair
6

Mempertimbangkan ini masih muncul ketika kita mencari EF di .NET Core, saya akan memposting jawaban saya di sini (Karena sudah banyak menghantui saya). Perhatikan bahwa ada beberapa seluk-beluk dengan versi EF .NET (tidak ada perintah awal, dan Anda harus menghapus file "Foto")

(Diuji dalam. NET Core 2.1)

Berikut langkah-langkahnya:

  1. Hapus _efmigrationhistorytabel.
  2. Cari seluruh solusi Anda untuk file yang berisi Snapshot dalam namanya, seperti ApplicationDbContextSnapshot.cs, dan hapus .
  3. Bangun kembali solusi Anda
  4. Lari Add-Migration InitialMigration

Harap dicatat: Anda harus menghapus SEMUA file Snapshot . Saya menghabiskan banyak waktu hanya menghapus basis data ... Ini akan menghasilkan migrasi kosong jika Anda tidak melakukannya.

Juga, di # 3 Anda bisa memberi nama migrasi Anda seperti yang Anda inginkan.

Berikut adalah beberapa sumber tambahan: asp.net INTI Migrasi yang dihasilkan kosong

Atur ulang migrasi Entity Framework 7

Jose A
sumber
3

Di EntityFramework 6 silakan coba:

Add-Migration Initial

untuk memperbarui file migrasi awal.

Asaf
sumber
3

Dalam Entity Framework Core.

  1. Hapus semua file dari folder migrasi.
  2. Ketik konsol

database dotnet dan drop -f -v

dotnet ef migrasi menambahkan Initial

pembaruan basis data dotnet ef

Liam Kernighan
sumber
2

Masalah saya ternyata adalah bahwa saya secara manual menghapus folder Migrasi. Saya melakukan itu karena saya ingin mencadangkan konten, jadi saya cukup menyeret folder keluar dari proyek. Saya kemudian memperbaiki masalah dengan memasukkannya kembali (setelah membuat salinan cadangan), kemudian menghapus folder Migrasi dengan mengklik kanan di Solutions Explorer dan memilih Delete dari menu popup.

John Deighan
sumber
1

Di EF6

  1. Hapus semua file Anda di folder 'migrasi' ... Tapi bukan 'buat awal' atau 'konfigurasi'.
  2. Hapus database.
  3. Sekarang jalankan Add-Migration Initial.
  4. Sekarang Anda dapat 'memperbarui-database' dan semuanya akan baik-baik saja.
adudley
sumber
1

Hapus tersebut MigrationsFolder, Cleanmaka Rebuildproyek tersebut. Ini berhasil untuk saya. Sebelum Bersih dan Bangun Kembali dikatakan Migrasi sudah ada sejak dalam memori cache, itu belum dihapus.

Siege21x
sumber
0

Metode ini tidak perlu menghapus __MigrationHistorytabel, jadi Anda tidak harus meletakkan tangan pada database saat digunakan.

  1. Hapus migrasi yang ada dari folder Migrasi.
  2. Di Package Manager, konsol dijalankan Add-Migration ResetMigrations
  3. Bersihkan riwayat migrasi dalam Up()metode:
/// <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()
    {
    }
}
Olexander Ivanitskyi
sumber
0

Di Net Core 3.0:

Saya tidak dapat menemukan cara untuk Mengatur Ulang Migrasi .

Saya juga mengalami masalah dengan migrasi yang rusak, dan jawaban yang diberikan di sini tidak bekerja untuk saya. Saya memiliki .Net Core 3.0 web API, dan di suatu tempat di bulan lalu saya mengedit database secara langsung. Ya, saya melakukan hal yang buruk.

Strategi yang disarankan di sini mengakibatkan sejumlah kesalahan dalam Package Manager Console:

  • Migrasi nama itu sudah ada
  • Tidak dapat menemukan snapshot
  • 'Force' bukan parameter yang dikenali

Memang, saya mungkin telah melewatkan langkah atau melewatkan membersihkan file yang benar, tetapi saya menemukan bahwa ada cara untuk membersihkan ini tanpa banyak kekerasan:

  • Hapus-Migrasi dari PMC untuk setiap migrasi dengan nama, dalam urutan pembuatan terbalik, hingga dan termasuk migrasi yang rusak
  • Tambah-Migrasi untuk membuat migrasi baru yang akan menjadi delta antara migrasi barang terakhir hingga skema saat ini

Sekarang ketika API web dimulai dengan basis data kosong, ia dengan benar membuat semua tabel dan properti yang cocok dengan model entitas.

HTH!

greenCodeMonkey
sumber
0

UPDATE 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Konteks Anda.

Diego Venâncio
sumber
-3
Enable-Migrations -EnableAutomaticMigrations -Force
Debendra Dash
sumber