Tidak dapat menghasilkan migrasi eksplisit dalam kerangka entitas

96

Saya menambahkan migrasi baru tetapi pesan ini menunjukkan:

Tidak dapat membuat migrasi eksplisit karena migrasi eksplisit berikut tertunda: [201203170856167_left]. Terapkan migrasi eksplisit tertunda sebelum mencoba membuat migrasi eksplisit baru.

Ada yang bisa bantu saya?

Noman Saeed
sumber
11
Ini terjadi pada saya ketika saya secara tidak sengaja mengalihkan proyek startup saya ke proyek lain. Anda (atau orang lain yang membaca ini) mungkin ingin memeriksanya dengan cepat sebelum mencoba beberapa pemecahan masalah yang lebih mendalam (terutama di mana Anda harus mulai menghapus migrasi dan semacamnya).
NicholasFolk
Ada kelas migrasi di direktori Migrasi yang tidak diperbarui di _MigrationHistory database. Menghapus kelas itu untuk memiliki status yang sama baik di direktori Migrasi dan database memecahkan masalah saya.
Arya Firouzian
1
Ini terjadi pada saya secara acak. Ketika itu terjadi, itu menunjukkan bahwa semua migrasi saya perlu diterapkan. Saya harus memulai ulang Visual Studio agar berfungsi karena saya sudah menyiapkan semuanya dengan benar.
Larry Terbang

Jawaban:

81

Ini memberi tahu Anda bahwa ada beberapa migrasi yang belum diproses dalam aplikasi Anda dan perlu dijalankan Update-Databasesebelum Anda dapat menambahkan migrasi lain.

Ladislav Mrnka
sumber
12
Apa yang saya ingin buat ulang dari migrasi awal? Ini menghalangi Anda untuk melakukannya?
Rebecca
Tidak berhasil untuk saya, Update-Database hanya memberi saya kesalahan lagi. Saya harus menghapus file yang tertunda terlebih dahulu.
Vahx
1
Jawaban Thomas berguna untuk kasus saya yang serupa.
Tarek Shawadfy
2
Mungkin perlu untuk mendeklarasikan startup-project-StartupProject ContentHub.Database
osanger
2
Update-Databasememberikan> Tidak dapat memperbarui database agar sesuai dengan model saat ini karena ada perubahan yang tertunda
ASpirin
53

Saya memiliki masalah yang sama. Rupanya kerangka kerja entitas menghasilkan kesalahan ini ketika tidak dapat terhubung ke database. Jadi, pastikan Anda dapat mengaksesnya sebelum mencari masalah lain.

Robin Dorbell
sumber
1
Saya juga akan menambahkan bahwa ini akan menjadi kasus ketika Anda memindahkan App.config Anda ke proyek lain atau jika itu hilang begitu saja dalam proyek Anda atau jika itu ada dalam proyek Anda tetapi tidak dikonfigurasi dengan benar.
Kode Maverick
Saya mendapatkan kesalahan yang sama ini setelah IP saya berubah (terjadi setelah berpindah lokasi dan setelah perubahan dyn dns). Ini menyebabkan firewall di Azure Database yang kami gunakan untuk mencabut login. Migrasi EF yang tidak membantu memberikan kesalahan di atas alih-alih "tidak bisa masuk" ...
Victor
8
Hal lain yang ingin saya buat adalah memastikan untuk memeriksa proyek startup Anda dengan string koneksi konteks db Anda. Saya mengalami masalah ini ketika saya mengubah sementara proyek startup saya dan tidak menyadari bahwa proyek lain tidak memiliki rangkaian koneksi yang sama.
Gage Trader
Menambahkan ke @GageTrader: Saya memiliki beberapa proyek startup, satu tanpa konfigurasi, dan proyek web dengan EF-config. proyek (Repositori) dengan migrasi memiliki konfigurasi EF yang sama di app.config-nya dengan proyek web. tetapi bahkan ketika saya memilih proyek repositori sebagai proyek startup, itu tidak berhasil, tetapi ketika saya mengatur proyek web untuk memulai itu berhasil.
JimiSweden
Saya harus secara eksplisit menyatakan parameter -ConnectionString, yang melakukan trik untuk saya
Brian Colavito
34

Anda juga perlu menjalankan "update-database" dari konsol pengelola paket untuk mendorong perubahan Anda ke database ATAU Anda dapat menghapus file migrasi yang tertunda ([201203170856167_left]) dari folder Migrasi Anda dan kemudian menjalankan kembali "add-migrasi" ke buat migrasi baru berdasarkan hasil edit Anda.

socketman
sumber
1
Saya menghapus file migrasi dan menjalankan add-migrasi, tetapi masih memberikan kesalahan yang sama.
nu everest
2
Terima kasih, tip tentang menghapus file migrasi yang tertunda adalah penyelamat
Manish
31

Kesalahan ini juga bisa berarti bahwa migrasi tidak dikenali lagi. Ini terjadi pada saya setelah mengubah nilai ContextKey di Migrations.Configuration. Solusinya cukup dengan memperbarui ContextKey di tabel database "__MigrationHistory" (atau mengembalikan nilai di kelas Konfigurasi, kurasa). ContextKey dan Namespace di aplikasi Anda harus cocok.

Thomas
sumber
1
Itu adalah jawaban yang tepat untuk kasus saya. Ketika saya menggunakan salah satu proyek lama saya untuk proyek baru yang serupa, saya tidak dapat membuat perubahan pada DB selama migrasi lama. Seperti yang disarankan Thomas, namespace berbeda di Migrations from the Contextkey di tabel _MigrationsHistory, yang menyebabkan migrasi lama tidak dikenali.
Tarek Shawadfy
1
Ini membantu saya karena saya menyebabkan masalah dengan mengganti nama solusi. Dalam prosesnya, saya telah mengganti nama ContextKey sehingga tidak lagi cocok dengan entri _MigrationHistory.
Joel
Juga bekerja untuk saya, mengatur kunci konteks eksplisit dalam konfigurasi, mengubahnya di __MigrationHistory dan database pembaruan memutuskan semuanya keren. Terima kasih!
James White
2
Konyol, tapi itu benar. Jika Anda memperbarui nama proyek, atau jika Anda membagi proyek Anda (kasus saya) menjadi beberapa dan Anda mencoba menambahkan migrasi baru dari proyek baru ke db yang sama, Anda harus menggunakan ContextKey yang benar, Anda dapat mengaturnya di konstruktor Konfigurasi ( Anda harus menggunakan kunci Konteks yang Anda miliki di tabel __MigrationHistory di target DB)
BotanMan
sama di sini, saya mengganti nama ruang nama default saya dan menggantinya di seluruh solusi saya yang menyebabkan masalah ini
WtFudgE
18

1. String Koneksi / Izin Koneksi

Periksa lagi string koneksi.

Pastikan pengguna yang Anda hubungi masih memiliki izin untuk membaca[__MigrationHistory] dan memiliki izin untuk mengedit skema.

Anda juga dapat mencoba mengubah string koneksi di file konfigurasi Aplikasi atau Web untuk menggunakan Keamanan Terintegrasi (Windows Auth) untuk menjalankan perintah tambahkan migrasi sebagai diri Anda sendiri .

Sebagai contoh:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

String koneksi ini akan masuk ke file App.config dari proyek tempat DbContext berada.

2. Proyek StartUp

Anda dapat menentukan proyek StartUp pada baris perintah atau Anda dapat mengklik kanan proyek dengan folder DbContext, Configurationdan Migrasi, lalu memilih Setel sebagai proyek StartUp . Saya serius, ini sebenarnya bisa membantu.

masukkan deskripsi gambar di sini

Jess
sumber
Ha ha. Saya berharap ini akan mendapatkan lebih banyak suara. Ini sering terjadi pada saya dan Integrated Securityperbaikannya bekerja dengan baik!
Jess
1
Saya memiliki masalah yang sama, tidak ada perintah migrasi yang berfungsi. Ternyata tidak mengatur proyek startup adalah pelakunya. Pengaturan itu memperbaiki masalah saya.
Vishal
Saya berhasil mengubah proyek startup! Saya yakin itu tidak akan berhasil tetapi saya tetap mencobanya karena semuanya gagal. Jawaban yang bagus.
Sylvain Rodrigue
"Set as Startup" - tidak akan pernah menduga! Terima kasih!!
Jasel
1
Ya, saya sengaja mengubah proyek startup, dan lupa mengubahnya kembali. Dan lucunya, satu migrasi sebelumnya dilakukan dengan proyek startup yang tepat, jadi semuanya berjalan dengan baik. Tapi ini logis sekarang - b / c EF mengambil string koneksi dari proyek, sehingga "tidak tahu" bahwa migrasi sebenarnya sudah diterapkan ke DB ...
kosist
8

Memiliki masalah yang sama dan dapat menyelesaikannya dengan beberapa petunjuk dari jawaban di atas:

  • Di konsol pengelola paket, periksa proyek default (arahkan ke proyek dengan konfigurasi migrasi
  • Pastikan startup-proj memiliki web.config dengan connectionstring yang valid (atau
  • Pastikan project dengan migrasi memiliki app.config / web.config dengan connectionstring yang valid
  • Periksa izin di DB (untuk pengguna yang dikonfigurasi di string koneksi Anda)

Gunakan "update-database -verbose" di konsol pengelola paket untuk mendapatkan informasi yang lebih spesifik tempat migrasi mencoba untuk terhubung. (Membantu dalam kasus saya untuk mengetahui proyek startup saya tidak disetel dengan benar ...)

melenturkan
sumber
2
menjalankan "update-database -verbose" dan melihat bahwa string koneksi saya rusak, lol. Jadi perintah add-migrasi memberikan pesan yang salah.
Wachburn
4
"Pastikan startup-proj {...}" memecahkan masalah saya. Terima kasih @flex
Andy Schmitt
7

Saat mengalami masalah ini, coba tambahkan parameter ke cmdlet migrasi tambahan Anda. Misalnya, menentukan proyek start up serta nama string koneksi dapat membantu EF menemukan database target Anda.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Dimana:

Delta_Defect_0973 adalah nama migrasi Anda

your.namespace.ContextClassName adalah nama kelas Konfigurasi Anda di folder migrasi, diawali dengan ruang nama lengkap.

DeltaProject adalah nama proyek utama Anda dengan file web.config atau app.config Anda.

DeltaSQL adalah nama string koneksi Anda yang ditentukan di file web.config atau app.config Anda.

Yves Rochon
sumber
Terima kasih. Ini sangat membantu saya.
Jess
Selain itu, jika Anda menggunakan injeksi ketergantungan dalam solusi Anda, Anda mungkin harus memilih Proyek Default yang berbeda di Konsol Pengelola Paket. Jika EF tidak dapat menemukan migrasi Anda, coba pilih proyek yang benar-benar berisi migrasi sebagai proyek default.
Yves Rochon
5

Kesalahan ini berarti ada migrasi yang menunggu yang harus dilakukan sebelum Anda dapat menjalankan migrasi eksplisit lainnya. Anda dapat memilih untuk

  1. Jalankan migrasi yang tertunda tersebut menggunakan perintah Update-Database
  2. Hapus migrasi yang tertunda tersebut. Cara teraman adalah membuka folder Migrasi, klik kanan [201203170856167_left]> Kecualikan dari proyek

Setelah ini, Anda dapat memulai lagi "Add-Migration ..."

Semoga membantu

Hung Vu
sumber
4

Hanya dua sen saya:

Skenario saya:

  1. Saya memulihkan database lokal saya ke status kerja.
  2. Sudah ada migrasi yang diterapkan padanya.
  3. Setiap kali saya mencoba menambahkan migrasi baru, saya mendapat kesalahan tentang migrasi yang tertunda seperti yang disebutkan OP saya.

Larutan:

Untuk menyiasati ini, saya hanya memberikan parameter yang lebih eksplisit:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Saya yakin bahwa Anda dapat menetapkan pengaturan di folder app.config Anda untuk memungkinkan Anda menetapkan perilaku ini secara default sehingga Anda tidak perlu memberikan parameter eksplisit setiap saat. Namun saya tidak yakin bagaimana melakukan ini.

IbrarMumtaz
sumber
1
Ini berhasil untuk saya, saya baru saja menambahkan nama migrasi ke akhir perintah yang ditunjukkan di atas.
sfors mengatakan memulihkan Monica
1
=) - senang saya bisa membantu.
IbrarMumtaz
1
-ConnectionStringNameadalah alternatif untuk ini, dan akan menarik string koneksi dari konfigurasi Anda dengan nama
Simon_Weaver
1
Ini membantu saya karena saya tidak menyimpan string koneksi di file konfigurasi
Sasinosoft
3

Ada ambiguitas dan kesalahan. Cara terbaik adalah dengan mengecualikan file migrasi saat ini dan membuat file migrasi baru ( tambahkan-migrasi ) dan kemudian menyalin konten migrasi baru ke file yang dikecualikan dan memasukkannya lagi dan menjalankan perintah update-database .

Sachin Cholkar
sumber
Saya baru saja menjalankan update-databaseperintah kemudian mencoba kembali add-migrationperintah saya dan berhasil
Smitty-Werben-Jager-Manjenson
3

saya memecahkan masalah yang sama seperti ini:

  • hapus file migrasi lama
  • update-database -force
  • Add-Migration AddedEntity
  • update-database
yilmazdincsoy.dll
sumber
1

Saya memiliki masalah yang sama dan hanya bisa menyelesaikannya dengan menjalankan Add-Migration 'MigrationName' -Force

Dengan -Force menjadi bagian penting.

Evan Barke
sumber
1

Database lokal saya tidak berisi __MigrationHistory, atau sudah ada. Saya membuat tabel secara manual, lalu memigrasikan data dalam tabel itu dari PROD ke database lokal saya. Hal ini menyebabkan VS berpikir bahwa migrasi telah diterapkan (yang telah mereka lakukan).

contactmatt
sumber
Saya memiliki masalah yang sama, saya menggabungkan DB langsung saya ke dalam produksi tetapi karena itu riwayat migrasi hilang.
matthy
1

Tips: Sebaiknya gunakan -Scriptsakelar untuk perintah migrasi jika Anda tidak yakin. Ini juga sangat membantu memahami apaUpdate-Database sebenarnya dilakukan.

Saya menjalankan perintah berikut untuk memperbarui database, kemudian saya mendapatkan skrip yang dapat saya terapkan secara manual (atau jalankan lagi tanpa tag -Script).

Karena Update-Databasesaya akan menjalankan yang berikut ini:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Dimana SQL_AzureLive string koneksi bernama di konfigurasi saya.

Kemudian saya dapat memverifikasi SQL terlihat benar, menerapkannya dan selesai. Seperti yang dikatakan banyak orang lain jika string koneksi salah atau tidak valid, Anda akan mendapatkan kesalahan ini.

Simon_Weaver
sumber
1

Bagi saya, saya menghapus file migrasi (dalam kasus Anda "201203170856167_left") dari Migrationsfolder, dan kemudian menjalankan perintah di bawah ini di konsol Package Manager

Add-Migration <Parameter>
Update-Database
Surendra Mourya
sumber
0

Skenario

  • Saya bekerja di cabang tempat saya membuat migrasi DB baru.
  • Saya siap memperbarui dari master, tetapi master juga memiliki migrasi DB baru-baru ini.
  • Saya menghapus migrasi db cabang saya untuk mencegah konflik.
  • Saya "memperbarui dari master".

Masalah

Setelah memperbarui dari master, saya menjalankan "Add-Migration my_migration_name", tetapi mendapatkan kesalahan berikut:

Tidak dapat membuat migrasi eksplisit karena migrasi eksplisit berikut tertunda: [201607181944091_AddExternalEmailActivity]. Terapkan migrasi eksplisit tertunda sebelum mencoba membuat migrasi eksplisit baru.

Jadi, saya menjalankan "Update-Database" dan mendapatkan error berikut:

Tidak dapat memperbarui database agar sesuai dengan model saat ini karena ada perubahan yang menunggu keputusan dan migrasi otomatis dinonaktifkan

Larutan

Pada titik ini menjalankan kembali "Add-Migration my_migration_name" memecahkan masalah saya. Teori saya adalah bahwa menjalankan "Update-Database" mendapatkan semua yang dibutuhkan untuk "Add-Migration" untuk bekerja.

Tod Birdsall
sumber
0

Saya juga menemukan masalah ini. Itu terjadi ketika saya membuat DB baru dan saya memiliki perubahan tertunda untuk migrasi kode pertama DB saya, lalu saya mencoba menjalankan perintah "Perbarui-Database". Solusi: Jalankan perintah "Add-Migration -MigrationName" untuk membuat migrasi baru untuk DB baru. Kemudian jalankan perintah "Update-Database".

Pritam
sumber
0

Saya mengalami masalah ini juga karena database yang saya tahu adalah yang terbaru saat menjalankan Add-Migration. Dipecahkan hanya dengan menjalankan perintah Add-Migration untuk kedua kalinya. Curigai masalah konektivitas, seperti yang disarankan oleh Robin Dorbell di atas.

spadelives
sumber
Dalam skenario saya Nama database bersifat case sensitive saat menjalankan perintah. segera setelah membuat koneksi
string
0

Itu terjadi ketika saya tiba-tiba mengganti nama kelas migrasi lama yang sudah ada di db. Saya memeriksa riwayat VCS, menentukannya dan mengganti namanya kembali. Semua bekerja setelah itu.

Dokter Coder
sumber
0

Saya melakukan cara lain. Saya menghapus database sepenuhnya dan menjalankan "update-database" lagi dalam vs.

Ghadir Farzaneh
sumber
Ini tidak memberikan perbaikan yang layak; migrasi yang valid mempertahankan struktur yang ada.
Ferdipux
0

Saya punya masalah yang lebih sederhana. VS secara keliru melaporkan kesalahan ini ketika saya memiliki koneksi VPN ke situs klien yang terhubung di workstation saya. Masalahnya adalah keamanan DBMS diatur untuk menerima permintaan hanya dari IP lokal saya yang sebenarnya. Cukup mematikan VPN sudah menyelesaikan masalah.

spadelives
sumber
0

Dalam kasus saya, saya lupa menambahkan alamat IP saya di aturan firewall di Azure, pada dasarnya karena saya tidak dapat terhubung ke database, saya mendapatkan kesalahan ini. Jadi khusus untuk kasus saya, saya menambahkan alamat IP saya di aturan firewall database di Azure dan semuanya bekerja dengan baik. Selain itu, ini bisa menjadi masalah proxy / koneksi internet / kata sandi nama pengguna DB / string koneksi DB dll. ATAU jelas, Anda mungkin memiliki migrasi yang tertunda yang Anda perlukan untuk menjalankan perintah Perbarui-Database.

Siddharth Sachdeva
sumber
0

Secara historis saya selalu menyelesaikan ini dengan menghapus migrasi yang tertunda, atau jika hanya ada 1 yang tersisa dan sebagian besar diinginkan, dengan menggunakan -f untuk membuatnya kembali.

Baru-baru ini, ini berhenti bekerja untuk saya.

Ketika ini terjadi pertama kali, saya memulai ulang Visual Studio, dan kemudian membiarkan saya melanjutkan.

Kedua kalinya, ini hanya berfungsi setelah saya menjalankan Clean pada proyek tersebut. Itu hampir seolah-olah migrasi yang tertunda dipertahankan meskipun menghapus semua file dari explorer.

Adam Marshall
sumber
0

Ini tidak akan menjadi jawaban bagi banyak orang, tetapi EF akan membuang kesalahan ini jika tidak dapat terhubung ke DB. Jika Anda bekerja dari rumah seperti saya, pastikan Anda masih terhubung ke VPN Anda!

CodingCretin
sumber
-1

Saya mengalami masalah yang persis sama setelah kembali dari migrasi ke migrasi lain.

Dalam kasus saya, saya "menarget migrasi" dari "migrasi06" ke "migrasi04".

Saya perlu menghapus "migrasi0" 6 dan kemudian saya bisa memaksa pembuatan "migrasi05". Ini pada dasarnya berarti bahwa Anda hanya perlu menyimpan migrasi berikutnya setelah yang ditargetkan.

Gonzo345
sumber
-1

Dalam kasus saya (menggunakan MS Visual Studio), itu semudah memulai ulang Visual Studio.

AGuyCalledGerald
sumber