Почему Entity Framework не может войти в SQL Server, когда установлен параметр «DropCreateDatabaseIfModelChanges»?

#sql-server #entity-framework-4.1 #ef-code-first

#sql-server #entity-framework-4.1 #ef-code-first

Вопрос:

У меня есть приложение MVC на основе Entity Framework, связанное с SQL Server.

Это не производственный сервер, поэтому я сначала использую код Entity Framework и использую преимущества Code First / Удаляю базу данных при изменении схемы.

У меня есть следующая строка подключения:

 <add name="MyDbContext"
     connectionString="Data Source=.SQLEXPRESS;Initial Catalog=appdb;User Id=xxx;Password=yyy;"
     providerName="System.Data.SqlClient" />
  

У меня были различные проблемы с EF / SQL, в конце концов, я создал нового пользователя с sysadmin ролью сервера, я создал базу данных appdb , установил для новой базы данных пользователей значение по умолчанию appdb и под User Mapping я дал пользователю db_owner разрешения (в разделе «Пользователь и схема по умолчанию» написано dbo).

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

Однако теперь я сменил свои занятия. Использование DropCreateDatabaseIfModelChanges вызывает желтый экран с Unable to login to SQL Server with user:xxx ошибкой, а ведение журнала SQL Server показывает Login failed for user 'xxx'. Reason: Password did not match that for the login provided. [CLIENT: <local machine>]

Если я запускаю приложение при отладке, оно показывает следующее:
This operation requires a connection to the 'master' database. Unable to create a connection to the 'master' database because the original database connection has been opened and credentials have been removed from the connection string. Supply an unopened connection.

Если я перейду с DropCreateDatabaseIfModelChanges на DropCreateDatabaseAlways — все будет работать так, как ожидалось…. Затем я могу вернуться назад и продолжить использование приложения без проблем.

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

Ответ №1:

Попробуйте добавить Persist Security Info=True в строку подключения.

Редактировать:

Установка значения Persist security info равным true позволяет подключению к базе данных сохранять конфиденциальную информацию пользователя = пароль. Я не знаю, что делает magic EF при удалении и воссоздании базы данных, но, скорее всего, он сбрасывает состояние соединения и требует новой аутентификации при открытом соединении. Без сохранения информации о безопасности открытое соединение не может повторно аутентифицировать пользователя, поскольку оно не знает его пароль.

Кстати. вы также можете попробовать загрузить EFv4.1 Обновление 1 или лучше EFv4.2. Я думаю, это должно решить эту проблему.

Комментарии:

1. Это сработало отлично! 1/ответ. Большое спасибо… Хотя, как человек, который хочет сам узнать о проблемах, а не публиковать вопрос по каждой проблеме (хотя, похоже, на данный момент это не так!), Я не думаю, что вы можете немного объяснить об этой проблеме / что на самом деле не так?