Почему Entity Framework не может войти в SQL Server, когда установлен «DropCreateDatabaseIfModelChanges»? - PullRequest
1 голос
/ 11 октября 2011

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

Это не рабочий сервер, поэтому я использую Entity Framework Code First и использую преимущества 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 отображается 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 Ответ

3 голосов
/ 12 октября 2011

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

Edit:

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

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

...