Не удается воссоздать базу данных SQL Server Express с помощью Entity Framework Code First и MVC 3 без изменения имени базы данных.

Когда я запускаю приложение со следующей строкой подключения, файл базы данных создается успешно.

<add name="ConnString1"
     connectionString="Data Source=.\SQLEXPRESS;
                       Database=Database1;
                       Integrated Security=SSPI;
                       AttachDBFilename=|DataDirectory|aspnetdb.mdf;
                       User Instance=true"
     providerName="System.Data.SqlClient" />

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

The underlying provider failed on Open.
{"Cannot open database \"Database1\" requested by the login. The login failed.\Database1\nLogin failed for user 'computer\\someuser'."}

Если я изменю Database=Database1 на Database=Database2 в строке подключения, файл базы данных будет успешно создан. Проблема повторяется всегда.

Как я могу воссоздать файл базы данных без изменения имени базы данных?


person adolfojp    schedule 16.01.2011    source источник
comment
Вы пытались использовать имя файла, отличное от aspnetdb.mdf? Какие действия вы предпринимаете для удаления существующей базы данных?   -  person Brian Ball    schedule 16.01.2011
comment
Когда я меняю имя файла базы данных, все становится еще более странным. Если я изменю имя с aspnetdb.mdf на aspnet2.mdf, я получу ошибку «Путь к базе данных \ aspnetdb.mdf уже существует». Выберите другое имя базы данных. Не удается прикрепить путь к файлу\aspnet2.mdf в качестве базы данных DatabaseName.' где path — это путь, а DatabaseName — это имя базы данных. Я удаляю файлы базы данных, щелкнув их правой кнопкой мыши в Visual Studio и удалив их.   -  person adolfojp    schedule 17.01.2011
comment
вы нашли исправление для этого? У меня похожая проблема. Я делаю шаг создания базы данных в xUnit. В первый раз работает нормально; во второй раз сбой с Cannot open database "[my database name]" requested by the login. The login failed. Login failed for user '[my domain user name]'. Если я пересобираю проект, он снова работает в xUnit. Но если я попытаюсь запустить тест без перестроения, он выдаст указанную выше ошибку.   -  person Ryan Lundy    schedule 16.02.2011
comment
Я не нашел исправления. Я решил прекратить использовать его, пока он не выйдет из бета-версии.   -  person adolfojp    schedule 20.02.2011
comment
У меня точно такая же проблема. Я использую EF4.1 RTW, VS 2010 SP1, SQL Express (с SQL Engine 2008 SP1)... это очень странно, каждый раз приходится переименовывать имя базы данных по умолчанию, чтобы иметь возможность создавать базу данных с тем же именем файла. Я буду использовать SQL CE, пока не решусь.   -  person Nestor    schedule 01.06.2011


Ответы (2)


Убедитесь, что права доступа к каталогу позволяют вам удалить файл mdf, а при входе в систему права доступа к каталогу схемы/таблицы являются распространенной проблемой с файлами mdf из-за высокой безопасности этих файлов из-за их потенциально конфиденциального характера.

person Chris McGrath    schedule 03.08.2011

Я вижу, что это более старый пост - надеюсь, это может помочь кому-то в том же затруднительном положении.

Сначала используя код, при первом запуске приложения оно создает базу данных без проблем - оно знает, что ее не существует, потому что она ранее не создавалась. Сначала код также принимает хеш-значение используемых моделей и сохраняет его в новой базе данных — проверьте наличие таблицы EdmMetadata — там хранится хэш-значение. Он использует хэш-значение, чтобы впоследствии проверить, изменилась ли модель от сборки к сборке, чтобы знать, следует ли удалить базу данных и перестроить ее.

Во второй раз после того, как вы удалили базу данных, он ищет отсутствующую базу данных, чтобы сравнить значение хэша модели, и не может найти ее, потому что теперь база данных отсутствует.

Мой обходной путь — добавить бессмысленное поле (не забыв удалить его после разработки) в одну из моделей, чтобы принудительно выполнить перестроение, не удаляя базу данных. В качестве альтернативы вы можете просто изменить хеш-значение базы данных, чтобы принудительно выполнить перестроение.

Это работает с базами данных приложений первого кода - не так уверен с базой данных членства.

person Andrew Harvey    schedule 30.03.2013