Я разрабатываю приложение C # WinForm на основе Entity Framework 6.
Приложение создает БД, если она не существует, и работает нормально, сохраняя и извлекая данные.
Проблема заключается в том, что каждый раз, когда я присоединяюDB для SSMS и отсоединения его (проверка флажка для закрытия каждого соединения), приложение больше не может использовать этот файл .mdf.
Он выбрасывает System.Data.SqlClient.SqlException
:
Не удается создать файл 'потому что он уже существует.Измените путь к файлу или имя файла и повторите операцию.СОЗДАТЬ БАЗУ ДАННЫХ не удалось.Некоторые имена файлов не могут быть созданы.Проверьте связанные ошибки.
Я могу воспроизвести это поведение с помощью следующих шагов:
- запустить приложение, .mdf создан;
- закрыть приложение;
- прикрепить mdf к SSMS;
- отключить мдф.
Почему приложение не может открываться и использовать .mdf после подключения и отключения от SSMS?Как я могу это исправить?
Единственное, что я заметил, это то, что права ACL для .mdf и .ldf полностью изменены и наследование отключено.Я попытался клонировать ACL с помощью PowerShell, но хотя действие клонирования работает правильно, приложение не может открыть базу данных.
Решение: Я наконец-то смог понять, что происходит!
При попытке подключиться к БД с помощью Visual Studio Server Explorer я получил эту ошибку: ...cannot be opened because it is version 869. This server supports version 852 and earlier. A downgrade path is not supported.
Таким образом, при присоединении БД, созданной в более старой версии MSSQLLocalDB к SSMS 2017, БД выполняет автоматическое обновление (я не могу найти там ни одного флага, чтобы не обновлять).
Поиск этого приведет к этой статье .
Мне удалось все решить, установив SQL Server 2017 Express LocalDB и заново создав экземпляр LocalDB, как показано в статье:
- установить только Sql Server 2017 Express LocalDB;
- остановить экземпляр:
sqllocaldb stop MSSQLLocalDB
- удалить экземпляр:
sqllocaldb delete MSSQLLocalDB
- создать новый экземпляр:
sqllocaldb create MSSQLLocalDB
- запустить экземпляр:
sqllocaldb start MSSQLLocalDB
Все работают сейчас.