У меня есть приложение, использующее NHibernate, которое уже развернуто и работает должным образом, и я переориентирую модульные тесты, чтобы использовать SQLite для повышения производительности и не допускать данных модульных тестов в «реальную» базу данных.
У меня есть простой тест, который создает объект календаря, сохраняет его, затем пытается прочитать его обратно и проверяет, что это тот же объект. Запись работает, но последующий выбор, чтобы прочитать ее обратно, возвращает 0 записей. Календарь имеет GUID в качестве первичного ключа, и я понимаю, что для этого требуется дополнительный параметр в строке подключения SQLite. Это моя строка подключения:
data source=:memory:;Version=3;New=true;Pooling=true;Max Pool Size=1;BinaryGuid=False
Через зарегистрированные операторы SQL, поступающие из NHibernate, я вижу вставки для записи сущности и ее зависимостей, а затем последующий оператор выбора. Все выглядит хорошо, но ничего не выбрано. Если я использую файловую базу данных вместо базы данных в памяти, я могу открыть таблицу в обозревателе серверов 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");
}
}