Я использую базу данных в памяти для некоторых быстрых модульных тестов, используя следующий код:
public class MemoryDb
{
private static Configuration configuration;
private static ISessionFactory sessionFactory;
static MemoryDb()
{
configuration = new NHibernate.Cfg.Configuration();
configuration.DataBaseIntegration(x =>
{
x.Driver<SQLite20Driver>();
x.Dialect<SQLiteDialect>();
x.ConnectionProvider<DriverConnectionProvider>();
x.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
x.IsolationLevel = IsolationLevel.ReadCommitted;
x.ConnectionString = "Data Source=:memory:;";
x.Timeout = 255;
x.BatchSize = 100;
x.LogFormattedSql = true;
x.LogSqlInConsole = true;
x.AutoCommentSql = false;
});
configuration.AddMapping(DbHelper.GetAutoMappings());
sessionFactory = configuration.BuildSessionFactory();
}
public static ISession GetSession()
{
var session = sessionFactory.OpenSession();
new SchemaExport(configuration).Execute(true, true, false, session.Connection, null);
return session;
}
}
Проблема в том, что экспорт схемы, похоже, не работает.Один из моих тестов выглядит так:
[Fact]
public void ShouldFindDuplicateByEmail()
{
using (var session = MemoryDb.GetSession())
{
var repo = new NHibernateCustomerRepository(session);
var customer = new Customer();
customer.EmailAddress = "test@test.com";
repo.Save(customer);
var duplicates = repo.FindDuplicates(customer);
Assert.Equal(1, duplicates.Length);
}
}
Тест не пройден с ошибкой no such table: Customers
.Это все работало с Fluent NHibernate и NHibernate 3.1.Я знаю, что это не проблема самих сопоставлений, потому что само приложение работает, когда я запускаю его на существующей базе данных SQL Server.Сбой только при запуске тестов.Есть какие-нибудь мысли?
Редактировать: Если я изменяю только строку подключения так, чтобы она записывала в файл (т. Е. x.ConnectionString = "data source=" + Path.GetTempFileName();
, все работает.БД в памяти, или он получает новую БД в памяти каждый раз, когда я выполняю команду сеанса, но понятия не имею, как это выяснить.