Какое влияние MARS оказывает на NHibernate? - PullRequest
9 голосов
/ 05 октября 2011

Я сравниваю Entity Framework с NHibernate, и я хотел бы знать, если бы при использовании SQL Server какой эффект (если таковой имеется) имел бы включение или отключение поддержки MARS на NHibernate?

MARS = НесколькоАктивные наборы результатов

Документация Entity Framwork гласит следующее:

При вызове метода Load во время foreach (C #) или For Each (Visual Basic) перечисления, Entity Framework пытается открыть новое средство чтения данных.Эта операция не будет выполнена, если вы не включили несколько активных наборов результатов, указав multipleactiveresultsets=true в строке подключения.Для получения дополнительной информации см. Использование нескольких активных наборов результатов (MARS) в MSDN.Вы также можете загрузить результат запроса в коллекцию List, которая закрывает средство чтения данных и позволяет выполнять перечисление по коллекции для загрузки ссылочных объектов.

Имеет ли NHibernate такую ​​же проблему?

Дополнительная информация при подключении к SQL Azure

1 Ответ

4 голосов
/ 06 ноября 2011

Проблема, на которую вы ссылаетесь, связана с «серверными курсорами», и, насколько мне известно, nHibernate , это не должно быть проблемой , просто потому, что она их не использует.Если вы используете LINQ для загрузки объектов в nHibernate, при первом доступе к перечислению foreach nHibernate загружает в память весь набор результатов запроса, и таким образом он может использовать соединение сеанса для загрузки всего остального.При использовании HQL-запроса или критериев, он будет загружать набор результатов, когда вы вызываете «List ()», а затем закрывает соединение.

Структура сущностей с другой стороны, старайтесь быть умными и использовать серверные курсорыпри прокрутке коллекции с помощью перечисления foreach, поэтому соединение objectContext «занято» курсором на стороне сервера до завершения перечисления foreach.Если MARS не включен, EF не может использовать соединение для загрузки другого набора результатов (вы все равно можете выдавать другие операторы, такие как обновление, вставка и удаление), и, таким образом, он выдаст вам ошибку типа ". Уже существует открытый DataReader.связан с этой Командой, которая должна быть сначала закрыта"или чем-то подобным.

Надеюсь, это поможет,MarcoРЕДАКТИРОВАТЬ:После некоторых исследований я обнаружил, что nHibernate может использовать MARS, но все же в версии 3.2.0.4000 нет драйвера для SqlServer, который его поддерживает.Конечно, SqlClientDriver не поддерживается (так как он предназначен для Sql2000, который не поддерживает MARS), но даже в Sql2008ClientDriver соответствующее свойство имеет значение false.В любом случае, это то, что я опубликую в команде nHibernate как можно скорее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...