Bagaimana cara membuat kembali basis data untuk Entity Framework?

143

Saya telah memasuki kondisi buruk dengan proyek ASP.Net MVC 5 saya, menggunakan Code-First Entity Framework. Saya tidak peduli tentang kehilangan data, saya hanya ingin dapat memulai baru, membuat ulang database dan mulai menggunakan migrasi Code-First.

Saat ini saya dalam keadaan di mana setiap upaya untuk Perbarui-Database menghasilkan pengecualian yang dilemparkan atau mendapatkan pesan kesalahan. Juga situs web tidak dapat mengakses database dengan benar. Bagaimana saya bisa menghapus semua migrasi, membuat kembali basis data dan memulai dari awal tanpa harus membuat proyek baru? Dengan kata lain, saya ingin menyimpan kode saya tetapi drop database.

Nanti saya juga akan ingin mendapatkan database penyebaran (SQL Server on Azure) dalam sinkronisasi. Sekali lagi, saya tidak keberatan menjatuhkan semua data - Saya hanya ingin membuatnya berfungsi.

Harap sediakan langkah-langkah bagaimana untuk kembali ke keadaan bersih. Sangat dihargai.

Toby Sharp
sumber
TBH jika Anda ingin sederhana DROP DATABASEmaka ....
Worthy7

Jawaban:

209

Ikuti langkah-langkah di bawah ini:

1) Pertama pergi ke Server Explorer di Visual Studio, periksa apakah ".mdf" Koneksi Data untuk proyek ini terhubung, jika demikian, klik kanan dan hapus.

2) Buka Solution Explorer, klik tampilkan ikon Semua File.

3) Buka App_Data, klik kanan dan hapus semua file ".mdf" untuk proyek ini.

4) Hapus folder Migrasi dengan mengklik kanan dan menghapus.

5) Buka SQL Server Management Studio, pastikan DB untuk proyek ini tidak ada, jika tidak hapuslah.

6) Pergi ke Package Manager Console di Visual Studio dan ketik:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Jalankan aplikasi Anda

Catatan: Pada langkah 6 bagian 3, jika Anda mendapatkan kesalahan "Tidak dapat melampirkan file ...", itu mungkin karena Anda tidak menghapus file database sepenuhnya di SQL Server.

Lin
sumber
Luar biasa! Ini berhasil, terima kasih! Memang sangat membantu. Apakah langkah-langkah serupa untuk menciptakan kembali basis data penyebaran (Azure SQL)?
Toby Sharp
hi @TobySharp, tidak ada masalah. Jika Anda tidak memiliki data di database Anda, Anda dapat mengikuti langkah-langkah ini, tetapi jika Anda memiliki data, langkah-langkahnya tidak sama.
Lin
Saya tidak memiliki data yang perlu saya simpan.
Toby Sharp
3
Perbarui, jika Anda menghapus dari VS (seperti instruksi katakan) dan bukan Windows Explorer, maka itu berfungsi. Juga, jika Anda tidak memiliki SQL Management Studio, Anda dapat menggunakan Sql Object Explorer di VS untuk menghapus dari localdb.
Mike Ward
3
Jika Anda mendapatkan kesalahan "Tidak dapat melampirkan file ...", meskipun Anda yakin telah menghapus semuanya, coba jawaban dari utas ini: stackoverflow.com/questions/13275054/…
Andy
44

Saya ingin menambahkan bahwa jawaban Lin benar.

Jika Anda menghapus MDF secara tidak benar, Anda harus memperbaikinya. Untuk memperbaiki koneksi yang kacau dalam proyek ke MDF. Jawaban singkat; buat ulang dan hapus dengan benar.

  1. Buat MDF baru dan beri nama sama dengan MDF lama, letakkan di lokasi folder yang sama. Anda dapat membuat proyek baru dan membuat mdf baru. MDF tidak harus cocok dengan tabel lama Anda, karena akan menghapusnya. Jadi buat atau salin yang lama ke folder yang benar.
  2. Buka di server explorer [klik dua kali mdf dari solution explorer]
  3. Hapus itu di server explorer
  4. Hapus dari penjelajah solusi
  5. jalankan update-database -force [Gunakan kekuatan jika perlu]

Selesai, nikmati db baru Anda

PEMBARUAN 11/12/14 - Saya menggunakan ini sepanjang waktu ketika saya melakukan perubahan db yang melanggar. Saya menemukan ini adalah cara yang bagus untuk mengembalikan migrasi Anda ke db asli:

  • Pasang db kembali ke aslinya
  • Jalankan migrasi normal untuk mengembalikannya ke saat ini

    1. Update-Database -TargetMigration:0 -force [Ini akan menghancurkan semua tabel dan semua data.]
    2. Update-Database -force [gunakan kekuatan jika perlu]
Steve Coleman
sumber
1
Senang sekali membantu ... Saya akan memperbarui jawaban saya. Baru-baru ini saya menemukan cara yang lebih baik untuk mengembalikan semua perubahan.
Steve Coleman
8

Ini bekerja untuk saya:

  1. Hapus database dari SQL Server Object Explorer di Visual Studio. Klik kanan dan pilih hapus.
  2. Hapus file mdf dan ldf dari sistem file - jika masih ada.
  3. Membangun Kembali Solusi.
  4. Mulai Aplikasi - basis data akan dibuat ulang.
Donal
sumber
1
Ya, yang harus saya lakukan adalah menghapus MDF, memperbarui string koneksi di web.config, kemudian jalankan aplikasi dan daftarkan akun baru. Itu membuat semua tabel lagi di database baru secara otomatis.
Dan Bechard
3

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.

System.Exception
sumber
1

Hanya ingin menambahkan jawaban sempurna @Lin:

5) B. Jika Anda tidak memiliki SQL Management Studio, buka "SQL Server Object Explorer". Jika Anda tidak dapat melihat proyek db di localdb "SQL Server Object Explorer", lalu klik tombol "Add SQL server" untuk menambahkannya ke daftar secara manual. Kemudian Anda dapat menghapus db dari daftar.

Dudi
sumber
Jika Anda ingin menambahkan sesuatu pada jawaban, tambahkan komentar ke jawaban itu daripada mengirim jawaban baru.
Oliver
1
Saya tidak menyadarinya. Jadi sekarang Anda dapat memindahkan jawaban Anda ke dalam komentar dan menghapus jawaban ini karena secara teknis itu bukan jawaban (lengkap) untuk pertanyaan :-)
Oliver
0

Kemungkinan perbaikan yang sangat sederhana yang berhasil untuk saya. Setelah menghapus referensi dan koneksi database yang Anda temukan di server / serverobject explorer, klik kanan folder App_Data (tidak menunjukkan objek apa pun di dalam aplikasi untuk saya) dan pilih buka. Setelah terbuka masukkan semua database / etc. file dalam folder cadangan atau jika Anda memiliki nyali hanya menghapusnya. Jalankan aplikasi Anda dan itu harus membuat ulang semuanya dari awal.

edencorbin
sumber
0

Solusi saya paling cocok untuk :
- menghapus file mdf Anda
- ingin membuat ulang db Anda.

Untuk membuat ulang basis data Anda, Anda perlu menambahkan koneksi menggunakan Visual Studio.

Langkah 1 : Buka Server Explorer tambahkan koneksi baru (atau cari ikon add db).

Langkah 2 : Ubah Datasource ke File Database Microsoft SQL Server .

Langkah 3 : tambahkan nama database apa pun yang Anda inginkan di bidang Nama file database . (Lebih disukai nama yang sama dengan yang Anda miliki di atribut web.config AttachDbFilename )

Langkah 4 : klik browse dan arahkan ke tempat yang Anda inginkan.

Langkah 5 : di perintah menjalankan konsol paket manajerupdate-database

Mbuso Mkhize
sumber