Ни сеанс NHibernate не являются поточно-ориентированными, и сущности обычно не являются поточно-ориентированными. Транзакции используются для решения проблем параллелизма, поэтому не имеет смысла запускать параллельные потоки в одной транзакции.
Я не знаю, для чего вы используете все эти темы. Обычно у вас есть один поток для одной транзакции, где вы можете выполнить столько бизнес-операций, сколько захотите (одну за другой).
Ваши транзакции должны содержать все, что принадлежит атомарной операции. Это не вариант разбить атомарную операцию на несколько транзакций. Также не имеет смысла помещать несколько независимых операций в одну транзакцию только для повторного использования кэша сеанса (для этого используется кэш второго уровня).
* Решения 1008 *
1. Не используйте сущности в механизме правил. Я предполагаю, что у вас есть трудоемкие вычисления и вы хотите разделить их, чтобы использовать несколько процессоров. В этом случае вы можете выполнять вычисления только в потоках. Когда вычисления завершены, они возвращают результат в поток транзакций, который изменяет сущности.
2. Не использовать отложенную загрузку : отключите отложенную загрузку для сущностей, которые необходимы для правил. Это может быть указано в запросе.
3. Загружать значения сущностей в основной поток : это, вероятно, самый сложный способ. Напишите сервис, который запускается в основном потоке. Он принимает лямбда-выражения в качестве аргумента, которые обращаются к свойствам сущности. Выражения помещаются в очередь и выполняются в главном потоке, а результат возвращается в вызывающий поток.
var myValue = entity.ExecuteInMainThread(x => x.Property);
Я даже не могу сказать, будет ли это слишком сильно блокировать потоки. Кстати, вы можете узнать, загружена ли коллекция или прокси-сервер или нет с помощью инструментов NHibernate, поэтому вам нужно только вернуться к основному потоку, когда это не так. Конечно, это требуется только для определенных свойств, но для обеспечения согласованности каждое свойство должно быть доступно одинаково.
Чем дольше я думаю о проблеме, тем больше я думаю, что было бы неплохо, чтобы такая функция была реализована самими прокси. Прокси-сервер должен запустить службу, запущенную в потоке, в котором он был создан. Затем он ставит в очередь отложенную загрузку в этой службе, а не выполняет ее сам. Это будет полностью прозрачно для вызывающего кода.
В случае, если вы реализуете «потоковую безопасную отложенную загрузку», вы можете реализовать ее как отдельную реализацию прокси. Это делает его многоразовым, не касаясь ядра NH. Это был бы хороший вклад в NH.