我有一个使用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的服务器资源管理器中打开表,并在表中看到正确的数据。如果我编写一个查询来尝试选择记录,如下所示:
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");
}
}发布于 2010-07-29 16:48:18
我猜想事务处理可能是问题所在。
因此,插入记录的事务可能还没有提交,因此执行select的(不同的)事务还没有看到新的数据,因此select没有返回任何内容。
发布于 2010-07-29 20:56:53
我明白了,问题不在于NHibernate或SQLite,而是我。每个日历都有一个相关的主题。在我们的生产数据库中,这些都是手动输入的,并且预期会提前存在。现在我正在使用SQLite进行测试,我从一个空数据库开始,并且这个引用数据不是预先填充的。NHibernate的Select语句用于获取Calendar,它在Themes表上使用内部联接,而该表中没有任何内容,select将返回空。哦哦。
更新测试设置代码以保存默认主题后,测试将通过。
https://stackoverflow.com/questions/3364882
复制相似问题