Я собираюсь придерживаться этого здесь, потому что я провел 3 часа с коллегой вчера, отлаживая эту проблему. Каждый ответ на этот вопрос говорит, что это всегда проблема брандмауэра; однако в нашем случае это не так. Надеюсь, это избавит кого-то от боли.
Ситуация, с которой мы столкнулись, заключается в том, что в настоящее время мы находимся в процессе перехода на Entity Framework. Это означает, что у нас есть части кода, где внутри одной транзакции соединения открываются как напрямую, используя new SqlConnection(connectionString).Open()
, так и косвенно, используя контекст данных EF.
Некоторое время это работало нормально в нашем приложении, но когда мы начали ретроспективно идти и ставить тесты вокруг кода, работающего в производстве, код, выполненный из тестового прогона, продолжал выдавать эту ошибку, когда объект EF в первый раз появлялся попытался подключиться к базе данных после в той же транзакции было установлено прямое соединение.
Причиной ошибки в конечном итоге стало то, что если вы не указали аргумент Application Name=
в строке подключения, Entity Framework добавляет его по умолчанию (что-то вроде EntityFrameworkMUF
). Это означает, что у вас есть два разных соединения в вашем пуле соединений:
- Тот, который вы открываете вручную без аргумента
Application Name=
- Автоматически сгенерированный суффикс
Application Name=EntityFrameworkMUF
и невозможно открыть два разных соединения внутри одной транзакции. В производственном коде указано название приложения; следовательно, это сработало; тестовый код не сделал. Указание аргумента Application Name=
исправило ошибку для нас.