NHibernate Aktuellen Session-Kontext-Problem
Ich habe vor kurzem zog aus der Verwendung einer ISession direkt auf einen umschlossenen ISession, Unit-of-Work-Art-Muster.
Ich zum testen verwendet, dies über SQL-Lite (in-memory). Ich habe eine einfache Hilfsklasse, die konfiguriert meine SessionFactory, erstellt eine ISession und baute dann das schema mit SchemaExport und dann wieder meine ISession und das schema gelebt, bis ich Schloss die Sitzung. Ich habe mich verändert diese leicht, so dass ich nun konfigurieren Sie eine SessionFactory, erstellen Sie eine ISession, erstellen Sie das schema, und übergeben Sie die Fabrik, um meine NHibernateUnitOfWork und Rückkehr zu meinem test.
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;
Intern, NHibernateUnitOfWork braucht, um die ISession, die wurde verwendet, um das schema oder die in-memory-Datenbank nicht wirklich ein schema, so ist das die Methode aufruft, um die 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;
}
}
Das problem ist, dass this.sessionFactory.GetCurrentSession
wirft immer eine exception, die sagen, dass die ICurrentSessionContext
ist nicht registriert.
Ich habe versucht viele verschiedene Möglichkeiten, um die Eigenschaft und die verschiedenen Werte (wie Sie oben sehen können, "thread_static" und meine eigenen ICurrentSessionContext
) aber keiner scheint zu funktionieren.
Jemand irgendwelche Ratschläge
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies: