NHibernate Cache Trouble - PullRequest
       0

NHibernate Cache Trouble

2 голосов
/ 22 июня 2011

У меня есть две сущности, имеющие отношение один ко многим, и это Пользователь и Адрес. Один пользователь может иметь много адресов. Я использую один сеанс и транзакцию для каждого шаблона HTTP-запроса, и кэш 1-го уровня включен. По какой-то причине я вижу, что мои лениво загруженные коллекции не заботятся об изменениях, внесенных в данные. Например, если я создаю один объект пользователя. Затем я создаю два объекта адреса и сохраняю их как

User u1 = CreateNewUser("olduser@xyz.tld", "olduser@xyz.tld");
u1.Save();

Address a1 = CreateNewAddress(u1, "olduser@xyz.tld", "Old1", "User1");
a1.Save();
Address a2 = CreateNewAddress(u1, "olduser@xyz.tld", "Old1", "User1");
a2.Save();
Session.Flush();
Assert.AreEqual(2, u1.Addresses.Count); // THIS IS FAILING BECAUSE COUNT IS 0

Теперь, когда я выполняю assert, я ожидаю, что пользовательский объект будет лениво загружать два адреса и число должно быть 2, но он возвращает 0. Если я просто выбрасываю полный кеш, выполняя вызов Session.Clear (), который тоже не работает. Но если я выбрасываю полный кеш, выполняя Session.Clear (), а затем снова загружаю свой пользовательский объект, он работает, как и ожидалось. Я не уверен, что мне чего-то не хватает или что-то еще не хватает в конфигурациях настройки кэша NHibernate. Любая помощь будет оценена.

Спасибо

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Вы должны добавить адреса к объекту пользователя или обновить объект пользователя (перезагрузить его из базы данных):

Session.Flush();
Session.Refresh(u1);
Assert.AreEqual(2, u1.Addresses.Count);
0 голосов
/ 22 июня 2011

Тип транзакции по умолчанию здесь - это фиксация на чтение, поэтому вам необходимо использовать Flush () после каждого Save () или изменять тип транзакции.

0 голосов
/ 22 июня 2011

Вам также придется добавить адреса в пользовательский класс ... Обычно вы видите людей, создающих метод u1.AddAddress (a1); который установит ссылку на пользователя в объекте адреса и добавит ее в список адресов пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...