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.