EF5: Неможливо вкласти файл "{0}" як базу даних "{1}"


140

Я стикаюся з точною проблемою, як описано тут (читайте розділ "Неможливо долучити до видаленого файлу MDF"), але рішення проблеми там не сказано ...

Коротше кажучи, проблема полягає в тому, що після видалення .mdfфайлу наступний виняток видається, коли я намагаюся отримати доступ до БД за допомогою EF 5.0.

DataException-> EntityException-> SqlException:
Неможливо приєднати файл '{0}' як базу даних '{1}'

Я видалив файл DB, і тепер я отримую це неприємне повідомлення про помилку під час роботи програми, очікуючи, що вона використовуватиме його ініціалізатор. Будь-який спосіб це виправити?


1
Вибачте, що я не дав конкретної відповіді, але в той час у мене не було рішення, яке працює 100% часу. Зараз я намагаюся уникати помилок, не використовуючи баз даних, що додаються користувачем. Я, як правило, можу виправити помилку, підключившись до SQL Server Management Studio і від'єднавши базу даних в помилку.
OdeToCode

Проблема в тому, що база даних вже не існує, оскільки я вже видалив фізичний файл. Я насправді намагався доглядати за цим в одній із студій (інтегрований у VS та зовнішній). Моя відповідь насправді не є рішенням, а навпаки, вона просто говорить про те, що вам не доведеться дотримуватися LocalDb.
Шиммі Вайцхандлер

Від експерта з питань EF Rowan Miller - див. Romiller.com/2013/05/17/… Ми сподіваємось запропонувати кращі рішення в наступній версії VS.
RickAndMSFT

Корисний посібник з усунення несправностей: odetocode.com/blogs/scott/archive/2012/08/15/…
Тім Абел

Відповіді:


220

Якщо ви видалите файл DB, він все ще залишається зареєстрованим у SqlLocalDB. Іноді це виправляє для видалення БД. Це можна зробити з командного рядка.

  1. Відкрийте "Command Promppt Propmpt для VisualStudio" у меню "Пуск / програми".
  2. Виконайте такі команди:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
Я не знайшов Sql Server Object Explorer, я думаю, тому що я використовую VS 2012 Express. Отже, я не можу випробувати прийняту відповідь. Однак ваша відповідь на мене спрацювала чудово. Дякую.
новачок

3
Ваша відповідь просто врятувала мене. У мене не було підменю (localdb) \ v11.0 з прийнятої відповіді, і я не міг видалити посилання зі студії управління SQL, тож ура!
Santux

18
Це працювало для мене після видалення файлів. Ви також можете запустити команди з Інструменти -> Менеджер пакунків бібліотеки -> Консоль диспетчера пакунків.
Барт Веркойєн

11
Як бічна примітка, v11.0специфічний для SQL LocalDB 2012. Якщо ви використовуєте LocalDB 2014, MS MSSqlLocalDbзамість цього перейменував його .
CodingWithSpike

4
стосовно вищезазначеного коментаря ви також не можете вводити будь-яке ім'я db, і воно буде просто застосовуватися до вашого за замовчуванням, я використовував нижче, для vs2015, і він працював: sqllocaldb.exe зупинка sqllocaldb.exe delete
Deviney

147

Для тих, хто ще шукає рішення ...

Перейдіть до Перегляду / Об'єкт SQL Server і видаліть базу даних з підрозділу (localdb) \ v11.0!
введіть тут опис зображення

По суті є локальна база даних, де зберігаються файли, і якщо ви хочете видалити файли бази даних, переконайтесь, що ви видалите їх з цієї утиліти провідника, а не вручну.


це трохи мене вдруге, вдруге було те, що у мене були автоматичні міграції == false FML
трудбайт

8
Крім того, якщо ви цього не бачите. Просто додайте нове з'єднання та введіть "(localdb) \ v11.0" (з Windows Auth). Це може здатися простим, але я деякий час дивився на свій екран. :)
Пітер

@Peter Добре, додано базу даних і тепер я бачу свої 2 контексти. Коли я видаляю з цього виду, я отримую нову помилку: "не можу отримати рівень доступу до даних для цієї бази даних". Мені вдалося обійти це за допомогою командного рядка.
nVentimiglia

1
Коли ви використовуєте заводські з'єднання за замовчуванням EF6, ви можете використовувати mssqllocaldb замість цього. Змініть сервер на (LocalDb) \ mssqllocaldb і подивіться, чи підключається він. Існує кілька версій LocalDb, і одна не показує вам усіх.
Jim Yarbro

Крім того, що я відчув: Клацніть на відключення та знову підключіться, якщо ви більше не бачите свою базу даних. (Оновлення не допомагає)
StefanG

19

Я спробував рішення JSobell спочатку, але там не бачив моєї бази даних. Я запускав команди CodingWithSpike з командного рядка VS Developer Command, але це теж не працювало. Нарешті, я запустив ті самі команди CodingWithSpike з Console Package Manager, і це спрацювало.

    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.

9

Добре.

Моє рішення було просто, я змінив використання локального сервера:

Я змінив DataSourceатрибут у рядку з'єднання з:

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

До:

Data Source=.\SQLEXPRESS;blah

Ще одне рішення - увійти в LocalDb через SQL Management Studio і спробувати видалити цю базу даних:

введіть тут опис зображення

Однак для мене це не спрацювало, коли я намагаюся видалити його, написано "НАЗВА: Microsoft SQL Server Management Studio

База даних "{0}" не існує на сервері. (SqlManagerUI)

Коли я намагаюся від'єднати його, база даних не відображається у списку для вибору від'єднання, "Take offline" також приводить мене до вищезгаданої помилки.

Що приводить мене до думки, що це суцільна помилка у LocalDB.


У мене виникають проблеми при використанні локальної БД з EF5
Nikos

LocalDB має перевагу тим, що ви можете запускати його під своїм локальним обліковим записом без необхідності привілеїв адміністратора, як і IIS Express. Це дозволяє ділитися проектами з багатьма розробниками без встановлення IIS або SQL Server для кожного окремого користувача.
Барт Веркойєн


2

Найкращий і простий відповідь. Я просто вирішив це зараз. Просто використовуйте ім'я сервера ur sql як джерело даних, початковий каталог - це ім'я вашої бази даних, і там ви йдете видалити рядок mdf


1

У моєму випадку я використовую міграції, а в config я просто змінив назву dataContext та сам клас dataContext (просто перейменувати), потім спробуйте ще раз, і це допомогло


1

Для SQL 2014, будь ласка, дотримуйтесь вибраної відповіді CodingWithSpike та цього коментаря

Як бічна примітка, v11.0 характерний для SQL LocalDB 2012. Якщо ви використовуєте LocalDB 2014, MS замість цього перейменував його на MSSqlLocalDb . - CodingWithSpike 29 серпня '14 о 19:20


З корисною стороною зауваження, я стикаюся з цим, працюючи над старим проектом з VS 2015 Детальніше . Також є подібні зміни у VS 2013 від v11.0до ProjectsV12 . Принаймні на моїй машині :-).
мета

0

У мене була така ж проблема, і я вирішив її, вручну встановивши папку «DataDirectory» в іншу папку моїх бінарних програм.

Я розміщую цей рядок у методі Global.asax Application_Start:

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

Моя рядок з'єднання наразі встановлена ​​таким чином:

<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" />


Я не перевіряв цього, але це, мабуть, не спрацювало. оскільки за замовчуванням DataDirectoryвже встановлено локальне App_Data, тому, якщо явно не було змінено раніше, ваш код нічого не робить.
Шиммі Вайцхандлер

Якщо ви йдете з таким підходом, не змінюйте каталог, не змінюйте ім'я файлу MDF. А також дивіться romiller.com/2013/05/17/…
RickAndMSFT

0

Я міг би це виправити, перейменувавши ім'я DataBase в моєму з'єднанні String, від aspnet- {numbers} за замовчуванням до простого імені, воно працювало.


0

Підключіться до (LocalDb) \ v11.0 за допомогою студії управління сервером Sql, видаліть db, а потім зробіть оновлення бази даних в консолі менеджера пакунків.


0

У мене була така ж проблема. Я запустив наступні команди в консолі диспетчера пакунків і це вирішило проблему

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.