我有一个使用NHibernate的应用程序已经部署并正常工作,我正在重新考虑单元测试以使用SQLite来提高性能,并将单元测试数据保留在“真正的”数据库之外。
我有一个简单的测试,它创建一个Calendar实体,保存它,然后尝试读回它并验证它是同一个对象。写入工作,但后续选择读取它返回0记录。 Calendar有一个GUID作为主键,我知道在SQLite连接字符串上需要一个额外的参数。这是我的连接字符串:
data source=:memory:;Version=3;New=true;Pooling=true;Max Pool Size=1;BinaryGuid=False
通过来自NHibernate的已记录的SQL语句,我看到了用于编写实体及其依赖项的插入,然后是后续的select语句。一切看起来都不错,但没有选择。如果我使用文件数据库而不是内存数据库,我可以在Visual Studio的服务器资源管理器中打开表,我在表中看到了正确的数据。如果我写一个查询来尝试选择记录,就像这样:
SELECT CalendarID, Name, Description
FROM dbo_Calendars
WHERE (CalendarID = 'a9cd9820-1694-4645-88d4-f682c5a6b9cc')
它也无法选择任何东西。我认为这是GUID处理的一个问题,但我很沮丧。
更新
这是测试用例的样子:
[Test]
public void SaveAndLoadCalendar()
{
Guid calId;
DAOFactory factory = (DAOFactory)DAOFactory;
ISession s = factory.SessionManager.CurrentSession;
using (var tx = s.BeginTransaction())
{
Calendar cal = new Calendar("Test Calendar", CalendarType.Test);
cal.Active = true;
cal.Browsable = true;
s.Save(cal);
tx.Commit();
calId = cal.ID;
}
Logger.InfoFormat("Calendar ID is {0} ", calId);
s.Clear();
using (var tx2 = s.BeginTransaction())
{
Calendar cal = s.Get<Calendar>(calId);
Assert.IsNotNull(cal, "Could not retrieve saved calendar");
Assert.AreEqual("Test Calendar", cal.Name, "Saved calendar not equal to original calendar");
}
}
答案 0 :(得分:0)
我猜想交易处理可能是问题所在。
因此,插入记录的事务可能尚未提交,因此执行select的(不同)事务尚未看到新数据 - 因此select不返回任何内容。
答案 1 :(得分:0)
我弄清楚了,问题不在于NHibernate或SQLite,而是我。每个日历都有一个关联的主题。在我们的生产数据库中,这些是手动输入的,并且预计会提前存在。现在我正在使用SQLite进行测试,我从一个空数据库开始,并且这个参考数据没有预先填充。用于获取Calendar的NHibernate的Select语句在Themes表上使用内部联接,并且该表中没有任何内容,select将返回空。 D'哦。
更新我的测试设置代码以保存默认主题后,测试通过。