Недавно я перешел от использования ISession напрямую к шаблону типа ISession, Unit-of-Work.
Я проверял это с помощью SQL Lite (в памяти). У меня есть простой вспомогательный класс, который настраивает мой SessionFactory, создал ISession, а затем построил схему с использованием SchemaExport, а затем возвратил мой ISession, и схема проживала до тех пор, пока я не закрыл сеанс. Я немного изменил это так, что теперь я настраиваю SessionFactory, создаю ISession, строю схему и передаю фабрику моему NHibernateUnitOfWork и возвращаю это моему тесту.
var databaseConfiguration =
SQLiteConfiguration.Standard.InMemory()
.Raw("connection.release_mode", "on_close")
.Raw("hibernate.generate_statistics", "true");
var config = Fluently.Configure().Database(databaseConfiguration).Mappings(
m =>
{
foreach (var assembly in assemblies)
{
m.FluentMappings.AddFromAssembly(assembly);
m.HbmMappings.AddFromAssembly(assembly);
}
});
Configuration localConfig = null;
config.ExposeConfiguration(x =>
{
x.SetProperty("current_session_context_class", "thread_static"); // typeof(UnitTestCurrentSessionContext).FullName);
localConfig = x;
});
var factory = config.BuildSessionFactory();
ISession session = null;
if (openSessionFunction != null)
{
session = openSessionFunction(factory);
}
new SchemaExport(localConfig).Execute(false, true, false, session.Connection, null);
UnitTestCurrentSessionContext.SetSession(session);
var unitOfWork = new NHibernateUnitOfWork(factory, new NHibernateUTCDateTimeInterceptor());
return unitOfWork;
Внутренне NHibernateUnitOfWork должен получить ISession, который использовался для создания схемы, или база данных в памяти фактически не будет иметь схему, поэтому этот метод вызывается для получения ISession.
private ISession GetCurrentOrNewSession()
{
if (this.currentSession != null)
{
return this.currentSession;
}
lock (this)
{
if (this.currentSession == null)
{
// get an existing session if there is one, otherwise create one
ISession session;
try
{
session = this.sessionFactory.GetCurrentSession();
}
catch (Exception ex)
{
Debug.Write(ex.Message);
session = this.sessionFactory.OpenSession(this.dateTimeInterceptor);
}
this.currentSession = session;
this.currentSession.FlushMode = FlushMode.Never;
}
}
Проблема в том, что this.sessionFactory.GetCurrentSession
всегда выдает исключение, сообщающее, что ICurrentSessionContext
не зарегистрирован.
Я пробовал множество разных способов установить свойство и разные значения (как вы можете видеть выше, «thread_static» и мой собственный ICurrentSessionContext
), но, похоже, ни один из них не работает.
Кто-нибудь получил любой совет