NHibernate правильный способ присоединения кэшированной сущности к другому сеансу - PullRequest
2 голосов
/ 29 мая 2010

Я использую NHibernate для запроса списка объектов из моей базы данных. После того, как я получил список объектов над ними, я перебираю список объектов и применяю алгоритм приближения расстояний, чтобы найти ближайший объект. Я рассматриваю эту функцию получения списка объектов и применяю алгоритм над ними как сложную операцию, поэтому я кеширую объект, который я нахожу из алгоритма в HttpRuntime.Cache.

После этого момента всякий раз, когда мне снова вводят введенные данные, я могу просто извлекать объект из кэша, вместо того, чтобы попадать в базу данных и просматривать список. Мой объект является сложным объектом, к которому прикреплены коллекции, в запросе, где я возвращаю полный список объектов, я не возвращаю ни одну из вложенных коллекций, поэтому, когда я читаю свой кэшированный объект, мне нужна ленивая загрузка для правильной работы чтобы иметь возможность полностью отобразить объект.

Первоначально я пытался использовать это для повторного связывания моего кэшированного объекта с новым сеансом

_session.Lock(obj, LockMode.None);

Однако при одновременном доступе к странице из другого экземпляра я получаю сообщение об ошибке

Незаконная попытка связать сборник с двумя открытыми сессиями

Затем я попробовал что-то другое с

_session.Merge(obj);

Однако просмотр результатов этого в NHProf показывает, что он удаляет и повторно связывает содержащиеся в моем наборе коллекции моего объекта с моим объектом, а это не то, чего я хочу, хотя, похоже, он работает нормально.

Как правильно это сделать? Ни один из них, кажется, не прав.

1 Ответ

1 голос
/ 29 мая 2010

Lock должно работать. Я думаю, что ваша проблема в том, что исходная сессия еще не ликвидирована. Попробуйте удалить исходный сеанс после кэширования объекта.

...