EF5: невозможно прикрепить файл '{0}' как базу данных '{1}'


140

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

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

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

Я удалил файл БД и теперь получаю неприятное сообщение об ошибке при запуске приложения, ожидающего, что оно будет использовать инициализатор. Как это исправить?


1
Извините, я не дал конкретного ответа, но в то время у меня не было решения, которое работало бы в 100% случаев. Сейчас я пытаюсь избежать ошибки, не используя подключенные пользователем базы данных. Как правило, я мог исправить ошибку, подключившись к SQL Server Management Studio и отключив базу данных с ошибкой.
— OdeToCode 09

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

От эксперта EF Роуэна Миллера - см. Romiller.com/2013/05/17/… Мы надеемся предоставить лучшие решения в следующей версии VS.
— RickAndMSFT 01

Полезное руководство по устранению неполадок: odetocode.com/blogs/scott/archive/2012/08/15/…
— Тим Абелл,

Ответы:


220

Если вы удалите файл БД, он все равно останется зарегистрированным в SqlLocalDB. Иногда исправляет удаление БД. Вы можете сделать это из командной строки.

  1. Откройте «Propmpt команды разработчика для VisualStudio» в меню «Пуск / программы».
  2. Выполните следующие команды:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
Я не нашел Sql Server Object Explorer, наверное, потому что я использую VS 2012 Express. Итак, я не могу попробовать принятый ответ. Однако ваш ответ сработал для меня отлично. Спасибо.
— Newman

3
Ваш ответ просто спас меня. У меня не было подузла (localdb) \ v11.0 из принятого ответа, и я не мог удалить ссылки из SQL Management Studio, так что ура вам!
— Santux

18
Это сработало для меня после удаления файлов. Вы также можете запускать команды из Инструменты -> Диспетчер пакетов библиотеки -> Консоль диспетчера пакетов.
— Барт Verkoeijen

11
В качестве примечания: это v11.0относится к SQL LocalDB 2012. Если вы используете LocalDB 2014, MS MSSqlLocalDbвместо этого переименовала его в .
— CodingWithSpike

4
Что касается приведенного выше комментария, вы также не можете вводить какое-либо имя базы данных, и оно будет просто применяться к вашему имени по умолчанию, я использовал ниже с vs2015, и это сработало: sqllocaldb.exe stop sqllocaldb.exe delete
— Deviney

147

Для тех, кто все еще ищет решение ...

Перейдите в View / SQL Server Object Explorer и удалите базу данных из подузла (localdb) \ v11.0!
введите описание изображения здесь

По сути, сохраняется локальная база данных, в которой должны быть файлы, и если вы хотите удалить файлы базы данных, убедитесь, что вы удалили их из этой утилиты проводника, а не вручную.


однажды это укусило меня, второй раз было то, что у меня была автоматическая миграция == false FML
— workabyte

8
Также, если вы этого не видите. Просто добавьте новое соединение и введите "(localdb) \ v11.0" (с Windows Auth). Это может показаться простым, но я некоторое время смотрел на свой экран. :)
— Питер

@Peter Хорошо, добавил базу данных, и теперь я вижу свои 2 контекста. Когда я удаляю из этого представления, я получаю новую ошибку: «не могу получить уровень доступа к данным для этой базы данных». Мне удалось обойти это с помощью командной строки.
— nVentimiglia 07

1
При использовании фабрики соединений EF6 по умолчанию вы можете вместо этого использовать mssqllocaldb. Измените сервер на (LocalDb) \ mssqllocaldb и посмотрите, подключается ли он. Существует несколько версий LocalDb, и одна не показывает вам всех.
— Джим Ярбро,

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

19

Сначала я попробовал решение JSobell, но не увидел там свою базу данных. Я запускал команды CodingWithSpike из командной строки VS Developer, но это тоже не сработало. Наконец, я запустил те же команды CodingWithSpike из консоли диспетчера пакетов, и это сработало.

    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)

Когда я пытаюсь отсоединить его, база данных не появляется в списке для выбора отсоединения, «Перевести в автономный режим» также приводит меня к ошибке, указанной выше.

Это заставляет меня думать, что это серьезная ошибка в LocalDB.


У меня проблемы с использованием локальной БД с EF5
— Никос

Преимущество LocalDB в том, что вы можете запускать его под своей локальной учетной записью без каких-либо привилегий администратора, как и IIS Express. Это позволяет обмениваться проектами со многими разработчиками без настройки IIS или SQL Server для каждого отдельного пользователя.
— Bart Verkoeijen


2

Лучший и простой ответ, который я только что решил сейчас, просто используйте имя сервера ur sql в качестве источника данных, начальный каталог - это имя вашей базы данных, а затем удалите строку mdf


1

В моем случае я использую миграции, а в конфигурации я просто изменил имя класса dataContext и dataContext (просто переименуйте), затем повторите попытку, и это помогло


1

Для SQL 2014 следуйте выбранному ответу CodingWithSpike и этому комментарию

В качестве примечания: v11.0 относится к SQL LocalDB 2012. Если вы используете LocalDB 2014, MS вместо этого переименовала его в MSSqlLocalDb . - CodingWithSpike 29 авг.


Полезное примечание, я столкнулся с этим при работе над старым проектом с VS 2015 Подробнее . Аналогичные изменения произошли и в VS 2013 с v11.0на ProjectsV12 . По крайней мере, на моей машине :-).
— iAM

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 01

0

Я мог бы исправить это, переименовав имя базы данных в строке подключения с 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.