我正在使用内存数据库进行一些快速单元测试,使用以下代码:
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();
,那么整个过程都有效。我猜测架构是否无法针对内存数据库运行正确,或者每次执行会话命令时它都会获得一个新的内存数据库,但是不知道如何解决这个问题。
答案 0 :(得分:2)
我在这里找到答案:https://forum.hibernate.org/viewtopic.php?p=2397541#p2397541
我必须将以下内容添加到db配置中:
x.ConnectionReleaseMode = ConnectionReleaseMode.OnClose;
否则,NHibernate在刷新每个语句后释放连接,从而删除带有模式的内存数据库。