это сообщение означает, что вы не настроили nhibernate, чтобы сообщить ему, как использовать контекстные сеансы. функция контекстных сеансов nhibernate означает, что nhibernate будет управлять отслеживанием текущего сеанса для вас, и вам нужно только беспокоиться о привязке и откреплении текущего сеанса к / из контекста и всякий раз, когда вы запрашиваете фабрику сеанса для текущего сеанса в этом контекст, вы получите тот же. модуль сообщений, который написал andreas, использует эту функцию (и вы должны это делать в своих обработчиках, если именно так вы управляете своими сеансами - это означает, что если у вас есть зависимость в ваших классах обработчиков от ISessionFactory и вы получаете сеансы оттуда, вы должны использовать ISessionFactory.GetCurrentSession () вместо ISessionFactory.OpenSesion ()).
Чтобы исправить возникшую проблему, вы должны указать NHibernate, как управлять контекстом сеанса. Есть несколько встроенных опций. тот, кого Андреас рекомендует в своем блоге, - ThreadStatic. это нормально в вашем случае, так как кажется, что вы подключаетесь только к одной базе данных и используете одну фабрику сеансов. обратите внимание, что этот контекстный класс поддерживает только одну фабрику сеансов, поэтому он не будет работать, если вы имеете дело с более чем одним. «Статический поток» означает, что каждый поток будет иметь свой собственный контекст сеанса - вы получите один и тот же сеанс, если вы находитесь в одном потоке. это прекрасно работает с nservicebus, так как обработчик будет полностью выполняться в потоке, а модуль сообщений будет следить за тем, чтобы вы получали новый сеанс с каждым сообщением и не использовали тот же, что и в предыдущем сообщении, обработанном этим потоком.
чтобы настроить nhibernate для этого, вам нужно установить свойство current_session_context_class равным thread_static. если вы настраиваете nhibernate напрямую, вы знаете, как вы это делаете. если вы используете свободный nhibernate, вам потребуется метод FluentConfiguration.ExposeConfiguration, чтобы сделать это:
Fluently.Configure()
// whatever else you are doing
.ExposeConfiguration(
c => c.SetProperty("current_session_context_class", "thread_static")
);
вот пост Андреаса об этом:
http://andreasohlund.net/2010/02/03/nhibernate-session-management-in-nservicebus/