Вы упомянули, что используете базу данных SQLite в памяти. Возможно, NHibernate решил закрыть соединение с базой данных между двумя операторами, что может привести к потере всех ваших таблиц.
Один из способов предотвратить это - создать собственную реализацию IConnectionProvider, которая позволяет вам явно контролировать, когда соединение закрыто.
Вот что я использовал для обработки этого в проекте:
public class InMemoryConnectionProvider : IConnectionProvider
{
private static readonly object syncObject = new object();
private static SQLiteConnection connection;
#region IConnectionProvider Members
public void Configure(IDictionary<string, string> settings)
{
}
public void CloseConnection(IDbConnection conn)
{
}
public IDbConnection GetConnection()
{
CreateConnection();
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
return connection;
}
public IDriver Driver
{
get { return new SQLite20Driver(); }
}
public void Dispose()
{
}
#endregion
public static void CreateConnection()
{
lock (syncObject)
{
if (connection == null)
{
var builder = new SQLiteConnectionStringBuilder
{
DataSource = ":memory:",
BinaryGUID = true,
DateTimeFormat = SQLiteDateFormats.ISO8601
};
connection = new SQLiteConnection(builder.ConnectionString);
connection.Open();
}
}
}
public static void DestroyConnection()
{
lock (syncObject)
{
if (connection != null)
{
connection.Dispose();
connection = null;
}
}
}
}
Вам также необходимо установить параметр connection.provider
в вашем конфигурационном файле, чтобы он указывал на этот класс.
В ваших тестах вы вызываете статический метод InMemoryConnectionProvider.CreateConnection()
либо в начале теста, либо в методе настройки. Когда вы закончите, вы позвоните InMemoryConnectionProvider.DestroyConnection()
, чтобы закрыть соединение. Поскольку реализация IConnectionProvider.CloseConnection()
запрещена, NHibernate не сможет самостоятельно закрыть соединение.