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

CodingWithSpike
источник
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!
введите описание изображения здесь

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

JSobell
источник
однажды это укусило меня, второй раз было то, что у меня была автоматическая миграция == 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.
AJs
источник
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
4

Самое простое решение - просто изменить имя вашей БД в строке подключения. См. Альтернативные решения в блоге Rowan Millers Как удалить базу данных из Visual Studio 2012 . Мы надеемся исправить эту проблему в следующих выпусках.

RickAndMSFT
источник
2

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

одаренный
источник
1

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

no0bassss
источник
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
Тони Ньюсом
источник