EF5: Tidak dapat melampirkan file '{0}' sebagai basis data '{1}'

140

Saya mengalami masalah persis seperti yang dijelaskan di sini (baca bagian "Tidak Dapat Melampirkan File MDF yang Dihapus"), tetapi solusi untuk masalahnya tidak diceritakan di sana ...

Singkatnya masalahnya adalah bahwa setelah menghapus .mdffile, pengecualian berikut dilontarkan ketika saya mencoba mengakses DB menggunakan EF 5.0.

DataException-> EntityException-> SqlException:
Tidak dapat melampirkan file '{0}' sebagai database '{1}'

Saya memang menghapus file DB dan sekarang saya mendapatkan pesan kesalahan buruk ketika menjalankan aplikasi mengharapkannya untuk menggunakan penginisialisasi itu. Adakah cara untuk memperbaikinya?

Shimmy Weitzhandler
sumber
1
Maaf saya tidak memberikan jawaban yang spesifik, tetapi pada saat itu saya tidak memiliki solusi yang berfungsi 100% setiap saat. Saya mencoba untuk menghindari kesalahan sekarang dengan tidak menggunakan basis data yang dilampirkan pengguna. Saya biasanya bisa memperbaiki kesalahan dengan menghubungkan dengan SQL Server Management Studio dan melepaskan basis data dalam kesalahan.
OdeToCode
Masalahnya adalah database tidak ada lagi karena saya sudah menghapus file fisik. Saya sebenarnya mencoba menjaganya di salah satu studio (terintegrasi dalam VS dan eksternal). Jawaban saya sebenarnya bukan solusi melainkan solusi, itu hanya mengatakan bahwa Anda tidak harus tetap berpegang pada LocalDb.
Shimmy Weitzhandler
Dari pakar EF Rowan Miller - lihat romiller.com/2013/05/17/... Kami berharap dapat memberikan solusi yang lebih baik dalam versi VS berikutnya.
RickAndMSFT
Panduan pemecahan masalah yang berguna: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

Jawaban:

220

Jika Anda menghapus file DB, itu masih tetap terdaftar dengan SqlLocalDB. Terkadang memperbaiki untuk menghapus DB. Anda dapat melakukan ini dari baris perintah.

  1. Buka "Propmpt Perintah Perintah untuk VisualStudio" di bawah menu mulai / program Anda.
  2. Jalankan perintah berikut:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

CodingWithSpike
sumber
1
Saya tidak menemukan Sql Server Object Explorer, saya kira karena saya menggunakan VS 2012 Express. Jadi, saya tidak bisa mencoba jawaban yang diterima. Namun, jawaban Anda bekerja untuk saya dengan sempurna. Terima kasih.
pemain baru
3
Jawaban Anda baru saja menyelamatkan saya. Saya tidak memiliki subnode (localdb) \ v11.0 dari jawaban yang diterima dan saya tidak bisa menghapus referensi dari SQL Management Studio, jadi hore untuk Anda!
Santux
18
Ini bekerja untuk saya setelah menghapus file. Anda juga dapat menjalankan perintah dari Tools -> Library Package Manager -> Package Manager Console.
Bart Verkoeijen
11
Sebagai catatan, v11.0ini khusus untuk SQL LocalDB 2012. Jika Anda menggunakan LocalDB 2014, MS menamainya sebagai MSSqlLocalDbgantinya.
CodingWithSpike
4
dalam kaitannya dengan komentar di atas Anda juga tidak dapat memasukkan nama db dan itu hanya akan berlaku untuk salah satu default Anda, saya menggunakan di bawah ini dengan vs2015 dan berhasil: sqllocaldb.exe berhenti menghapus
sqllocaldb.exe
147

Bagi mereka yang masih mencari solusi ...

Pergi ke View / SQL Server Object Explorer dan hapus database dari (localdb) \ v11.0 subnode!
masukkan deskripsi gambar di sini

Pada dasarnya ada database lokal yang disimpan di mana file seharusnya berada, dan jika Anda ingin menghapus file database pastikan Anda menghapusnya dari utilitas explorer ini, bukan secara manual.

JSobell
sumber
ini menggigit saya sekali, yang kedua adalah saya memiliki migrasi otomatis == FML palsu
workabyte
8
Juga, jika Anda tidak melihatnya. Cukup tambahkan koneksi baru dan masukkan "(localdb) \ v11.0" (dengan Windows Auth). Ini mungkin tampak sederhana, tetapi saya menatap layar saya untuk sementara waktu di sana. :)
Peter
@ Peter Ok, Ditambahkan database dan sekarang saya melihat 2 konteks saya. Ketika saya menghapus dari tampilan ini, saya mendapatkan kesalahan baru: 'tidak dapat mengambil tingkat akses data untuk database ini'. Saya bisa menyelesaikan ini dengan menggunakan command prompt.
nVentimiglia
1
Saat menggunakan pabrik koneksi default EF6, Anda mungkin menggunakan mssqllocaldb sebagai gantinya. Ubah server menjadi (LocalDb) \ mssqllocaldb dan lihat apakah itu terhubung. Ada beberapa versi LocalDb, dan satu tidak menunjukkan semuanya.
Jim Yarbro
Juga, apa yang saya alami: Klik pada putuskan sambungan dan kemudian hubungkan lagi jika Anda tidak melihat database Anda lagi. (Refresh tidak membantu)
StefanG
19

Saya memang mencoba solusi JSobell pertama tetapi tidak melihat database saya terdaftar di sana. Saya menjalankan perintah CodingWithSpike dari VS Developer Command Prompt, tapi itu tidak berhasil. Akhirnya saya menjalankan perintah CodingWithSpike yang sama dari Package Manager Console dan itu berhasil.

    PM> sqllocaldb.exe stop v11.0
    LocalDB instance "v11.0" stopped.

    PM> 
    PM> sqllocaldb.exe delete v11.0
    LocalDB instance "v11.0" deleted.

    PM> sqllocaldb.exe start v11.0
    LocalDB instance "v11.0" started.
AJs
sumber
9

Baik.

Solusi saya sederhana, saya berubah menggunakan server lokal:

Saya mengubah DataSourceatribut dalam string koneksi dari:

Data Source=(LocalDb)\v11.0;blah

Untuk:

Data Source=.\SQLEXPRESS;blah

Solusi lain adalah masuk ke LocalDb melalui SQL Management Studio, dan mencoba untuk menghapus database itu:

masukkan deskripsi gambar di sini

Namun itu tidak berhasil untuk saya, ketika saya mencoba untuk menghapusnya tertulis "TITLE: Microsoft SQL Server Management Studio

Database '{0}' tidak ada di server. (SqlManagerUI)

Ketika saya mencoba untuk melepaskannya, database tidak muncul dalam daftar untuk pilihan detach, "Take offline" juga membawa saya ke kesalahan di atas.

Yang membuat saya berpikir ini adalah bug yang solid di LocalDB.

Shimmy Weitzhandler
sumber
Saya mengalami masalah dalam mencoba menggunakan DB lokal dengan EF5
Nikos
LocalDB memiliki keuntungan bahwa Anda dapat menjalankannya di bawah akun lokal Anda tanpa memerlukan hak Administrator, seperti IIS Express. Ini memungkinkan untuk berbagi proyek dengan banyak pengembang tanpa mengatur IIS atau SQL Server untuk setiap pengguna.
Bart Verkoeijen
2

Jawaban terbaik dan mudah saya baru saja menyelesaikannya sekarang, Cukup gunakan nama server sql Anda sebagai sumber data, katalog awal menjadi nama database Anda dan di sana Anda pergi menghapus baris mdf

berbakat
sumber
1

Dalam kasus saya, saya menggunakan migrasi dan dalam konfigurasi saya cukup mengubah nama dataContext dan kelas dataContext itu sendiri (hanya ganti nama), lalu coba lagi dan itu membantu

no0bassss
sumber
1

Untuk SQL 2014 silakan ikuti jawaban yang dipilih CodingWithSpike dan komentar ini

Sebagai catatan tambahan, v11.0 khusus untuk SQL LocalDB 2012. Jika Anda menggunakan LocalDB 2014, MS menamainya menjadi MSSqlLocalDb . - CodingWithSpike 29 Agustus '14 pukul 19.20

Yang satu
sumber
Catatan penting, saya menemukan ini bekerja pada proyek lama dengan VS 2015 Info lebih lanjut . Ada juga perubahan serupa di VS 2013 dari v11.0ke ProjectsV12 . Setidaknya di mesin saya :-).
bidik
0

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan secara manual mengatur folder "DataDirectory" ke folder lain di binari aplikasi saya.

Saya meletakkan baris ini dalam metode Global.asax Application_Start:

AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

String koneksi saya saat ini diatur untuk ini:

<connectionStrings>
    <add name="DataContext" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DataContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DataContext.mdf"
  providerName="System.Data.SqlClient" />

Filipe Scur
sumber
Saya tidak mengujinya, tetapi ini mungkin seharusnya tidak berhasil. karena DataDirectorysudah diatur ke lokal App_Datasecara default, jadi kecuali jika secara eksplisit diubah sebelumnya, kode Anda tidak melakukan apa-apa.
Shimmy Weitzhandler
JIKA Anda menggunakan pendekatan ini, jangan ubah direktori, ubah nama file MDF. JUGA
RickAndMSFT
0

Saya bisa memperbaikinya dengan mengubah nama nama DataBase di String koneksi saya, dari aspnet- {number} default menjadi nama sederhana, itu berhasil.

Edgar Salazar
sumber
0

Terhubung ke (LocalDb) \ v11.0 menggunakan studio manajemen server Sql, hapus db dan kemudian lakukan pembaruan-database di konsol manajer paket.

Nidhin
sumber
0

Saya memiliki masalah yang sama. Saya menjalankan perintah berikut di konsol manajer paket dan itu memperbaiki masalah

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Tony Newsom
sumber