Будучи новичком в Entity Framework, я действительно зациклен на том, как продолжить этот набор проблем. В проекте, над которым я сейчас работаю, весь сайт сильно интегрирован с моделью EF. Сначала доступ к контексту EF контролировался с помощью загрузочной машины Dependency Injection. По оперативным причинам мы не смогли использовать библиотеку DI. Я удалил это и использовал модель отдельных экземпляров контекстного объекта, где это необходимо. Я начал получать следующее исключение:
Тип "XXX" отображается более одного раза.
Мы пришли к выводу, что различные экземпляры контекста вызывают эту проблему. Затем я абстрагировал объект контекста в один статический экземпляр, к которому обращался каждый поток/страница. Теперь я получаю одно из нескольких исключений в отношении транзакций:
Новая транзакция не допускается, так как существуют другие потоки в сеансе.
Операция транзакции не может быть выполнена, поскольку есть ожидающие запросы, работающие над этой транзакцией.
ExecuteReader требует, чтобы команда имела транзакцию, когда соединение, назначенное команде, находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано.
Последнее из этих исключений произошло при операции загрузки. Я не пытался сохранить состояние контекста обратно в Db в потоке, который не удался. Однако был другой поток, выполняющий такую операцию.
Эти исключения в лучшем случае являются прерывистыми, но мне удалось заставить сайт перейти в состояние, когда новые соединения были отклонены из-за блокировки транзакции. К сожалению, я не могу найти детали исключения.
Я предполагаю, что мой первый вопрос заключается в том, должна ли использоваться модель EF из статического единственного экземпляра? Кроме того, можно ли устранить необходимость в транзакциях в EF? Я попытался использовать объект TransactionScope
без успеха...
Честно говоря, я много застрял здесь и не могу понять, почему (что должно быть) довольно простые операции вызывают такую проблему...