Я обнаружил, что начиная с NHibernate 5.0 я могу вызвать следующий код для удаления всех записей таблицы:
session.Query<T>().Delete();
Он выполняет код в базе данных, не копируя его по сети, что должно значительно повысить производительность. Но этот запрос истекает.
Я получаю следующую ошибку:
Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Я попытался установить для параметра Connection Timeout в моей строке подключения значение 0 и 3600, но это не имеет значения.
В моей таблице всего около 200 записей. Но один столбец представляет собой PDF-файл с кодировкой base64, поэтому он довольно большой, и запрос займет несколько секунд.
Что еще можно попробовать?
Вы изучили активность своей базы данных (SQL Server?) Изолированно? Например, если вы запустите запрос DELETE FROM MyTable WHERE MyColumn = 1; (или любой другой правильный запрос), какова производительность? Есть ли какие-то разногласия в этой таблице, которые приводят к блокировке DELETE?


Похоже, вам нужно увеличить время ожидания команды.
Обратите внимание, что есть разница между тайм-аут соединения и тайм-аут команды.
Вы можете установить время ожидания команды по умолчанию (в секундах) для команд ADO.NET, созданных NHibernate, используя свойство конфигурации сеанса command_timeout NHibernate. Есть несколько способов сделать это в зависимости от того, какой метод вы используете для настройки NHibernate. Вот основы: http://nhibernate.info/doc/nhibernate-reference/session-configuration.html
Мне удалось обойти эту ошибку, используя session.Query <T> () .Timeout (600) .Delete () ;. Но я чувствую, что это временный обходной путь. Я был бы признателен за лучшее объяснение / понимание того, почему это необходимо.