#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/ответ. Большое спасибо… Хотя, как человек, который хочет сам узнать о проблемах, а не публиковать вопрос по каждой проблеме (хотя, похоже, на данный момент это не так!), Я не думаю, что вы можете немного объяснить об этой проблеме / что на самом деле не так?