Поскольку этот вопрос стоит на первом месте в списке результатов поиска, я просто хотел добавить слово предостережения. У меня есть приложение, которое должно было использовать роль приложения, и решение okrumnow сначала показалось работающим.
Однако в модульном тестировании я обнаружил, что иногда обработка события StateChanged приводит к тому, что событие будет вызвано дважды, и вы получите ошибку:
«Олицетворение контекста безопасности сеанса» не может быть вызвано в этом пакете, потому что его вызвал одновременный пакет.
Кажется, это помогает изменить условное выражение на:
args.CurrentState == ConnectionState.Open &&
args.CurrentState == ConnectionState.Closed
Но это по-прежнему не устраняет ошибку. Я подтвердил это в EF4.3 и EF5. Ladislav правильно, что идеальным способом является создание соединения для DbContext и сообщение контексту, что он не является владельцем.
Кроме того, при такой настройке пул соединений невозможен, поскольку нет события ConnectionState.Closing
, по которому вы могли бы позвонить sp_unsetapprole
до закрытия вашего соединения.
Поскольку у меня была гибкость, мое решение состояло в том, чтобы исключить использование роли приложения и вместо этого использовать выделенный вход в SQL. В любом случае вы жестко кодируете пароль ...