Sementara pertanyaan ini didasarkan pada tidak peduli tentang data, terkadang pemeliharaan data sangat penting.
Jika demikian, saya menulis daftar langkah-langkah tentang cara memulihkan dari mimpi buruk Entity Framework ketika database sudah memiliki tabel dengan nama yang sama di sini: Cara memulihkan dari mimpi buruk Entity Framework - database sudah memiliki tabel dengan nama yang sama
Tampaknya ... seorang moderator melihat cocok untuk menghapus posting saya jadi saya akan menempelkannya di sini:
Bagaimana memulihkan dari mimpi buruk Entity Framework - database sudah memiliki tabel dengan nama yang sama
Deskripsi : Jika Anda seperti kami saat tim Anda baru di EF, Anda akan berakhir dalam keadaan di mana Anda tidak dapat membuat basis data lokal baru atau Anda tidak dapat menerapkan pembaruan ke basis data produksi Anda. Anda ingin kembali ke lingkungan EF yang bersih dan tetap berpegang pada dasar-dasar, tetapi Anda tidak bisa. Jika Anda membuatnya berfungsi untuk produksi, Anda tidak dapat membuat db lokal, dan jika Anda membuatnya berfungsi untuk lokal, server produksi Anda menjadi tidak sinkron. Dan akhirnya, Anda tidak ingin menghapus data server produksi.
Gejala : Tidak dapat menjalankan Update-Database karena mencoba menjalankan skrip pembuatan dan database sudah memiliki tabel dengan nama yang sama.
Pesan Galat: System.Data.SqlClient.SqlException (0x80131904): Sudah ada objek bernama '' dalam database.
Latar Belakang Masalah : EF memahami di mana basis data saat ini dibandingkan dengan di mana kode berada di berdasarkan tabel dalam basis data yang disebut dbo .__ MigrationHistory. Ketika melihat Skrip Migrasi, ia mencoba untuk melakukan rekonsiliasi di tempat terakhir dengan skrip. Jika tidak bisa, itu hanya mencoba menerapkannya secara berurutan. Ini berarti, ini akan kembali ke skrip pembuatan awal dan jika Anda melihat bagian paling pertama dalam perintah UP, itu akan menjadi CreeateTable untuk tabel di mana kesalahan terjadi.
Untuk memahami ini secara lebih terperinci, saya sarankan menonton kedua video yang dirujuk di sini:
https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx
Solusi : Yang perlu kita lakukan adalah menipu EF agar berpikir bahwa basis data saat ini mutakhir tanpa menerapkan perintah CreateTable ini. Pada saat yang sama, kami masih menginginkan perintah-perintah itu ada sehingga kami dapat membuat basis data lokal baru.
Langkah 1: Produksi DB bersih
Pertama, buat cadangan db produksi Anda. Di SSMS, Klik kanan pada database, Pilih "Tugas> Ekspor aplikasi data-tier ..." dan ikuti petunjuknya. Buka basis data produksi Anda dan hapus / jatuhkan tabel .__ MigrationHistory.
Langkah 2: Lingkungan lokal bersih
Buka folder migrasi Anda dan hapus. Saya berasumsi Anda bisa mendapatkan ini semua dari git jika perlu.
Langkah 3: Buat Kembali Inisial
Dalam Package Manager, jalankan "Enable-Migrations" (EF akan meminta Anda untuk menggunakan -ContextTypeName jika Anda memiliki banyak konteks). Jalankan "Add-Migration Initial -verbose". Ini akan Membuat skrip awal untuk membuat basis data dari awal berdasarkan kode saat ini. Jika Anda memiliki operasi seed di Configuration.cs sebelumnya, salin itu ke seberang.
Langkah 4: Trick EF
Pada titik ini, jika kita menjalankan Update-Database , kita akan mendapatkan kesalahan aslinya. Jadi, kita perlu menipu EF agar berpikir itu mutakhir, tanpa menjalankan perintah ini. Jadi, masuk ke metode Naik dalam migrasi awal yang baru saja Anda buat dan komentar semuanya.
Langkah 5: Perbarui-Basis Data
Tanpa kode untuk dijalankan pada proses Naik, EF akan membuat tabel dbo .__ MigrationHistory dengan entri yang benar untuk mengatakan bahwa ia menjalankan skrip ini dengan benar. Pergi dan periksa jika Anda suka. Sekarang, batalkan komentar kode itu dan simpan. Anda dapat menjalankan Pembaruan-Database lagi jika Anda ingin memastikan bahwa EF menganggapnya sebagai yang terbaru. Itu tidak akan menjalankan langkah Atas dengan semua perintah CreateTable karena itu berpikir sudah melakukan ini.
Langkah 6: Pastikan EF benar-benar terkini.
Jika Anda memiliki kode yang belum menerapkan migrasi, ini yang saya lakukan ...
Jalankan "Add-Migration MissingMigrations" Ini akan membuat skrip kosong secara praktis. Karena kode sudah ada di sana, sebenarnya ada perintah yang benar untuk membuat tabel ini di skrip migrasi awal, jadi saya hanya memotong perintah drop CreateTable dan setara ke dalam metode Atas dan Bawah.
Sekarang, jalankan Update-Database lagi dan saksikan itu mengeksekusi skrip migrasi baru Anda, membuat tabel yang sesuai dalam database.
Langkah 7: Konfirmasikan kembali dan komit.
Bangun, uji, jalankan. Pastikan semuanya berjalan kemudian lakukan perubahan.
Langkah 8: Biarkan seluruh tim Anda tahu cara melanjutkan.
Ketika orang berikutnya memperbarui, EF tidak akan tahu apa yang menimpanya mengingat skrip yang telah dijalankan sebelumnya tidak ada. Tetapi, dengan asumsi bahwa basis data lokal dapat dihancurkan dan dibuat kembali, ini semua baik. Mereka harus membuang basis data lokal mereka dan menambahkan membuatnya dari EF lagi. Jika mereka memiliki perubahan lokal dan migrasi yang tertunda, saya akan merekomendasikan mereka membuat DB lagi pada master, beralih ke cabang fitur mereka dan membuat kembali skrip migrasi dari awal.
DROP DATABASE
maka ....