Проблема при получении объекта, который был изменен в другом сеансе - PullRequest
0 голосов
/ 07 июля 2010

У меня странная проблема в моем клиентском приложении. Вот немного фона:

  • Я использую один сеанс для каждой модели представления.
  • Модели моего вида взаимодействуют друг с другом с помощью Посредника .

У меня есть модель административного представления, в которой я отображаю список своих сущностей. Я могу отредактировать сущность, в результате чего открывается новая модель представления, которая получает идентификатор сущности, подлежащей редактированию через посредника.

Когда пользователь нажимает кнопку «Редактировать», моя модель представления редактирования обновляет сущность со своим собственным сеансом и снова использует посредник с отредактированным идентификатором сущности, чтобы попросить модель основного представления обновить список сущностей.

Допустим, я изменил логическое свойство Visible для сущности.

Когда я редактирую сущность, я вижу вызов UPDATE в NHibernate, обновляющий сущность в базе данных.

Когда я возвращаюсь в модель основного вида, я делаю 2 вещи:

  1. Я прошу у NHibernate обновленную сущность
  2. Я обновляю список объектов, чтобы отобразить все объекты, с помощью специального фильтра. (Показать все видимые объекты, например.)

Что странно, так это то, что сущность, которую я получаю от NH в первой инструкции, все еще имеет старое значение свойства Visible, но в списке моих видимых сущностей отредактированная сущность отсутствует ...

Вот две функции репозитория, которые я использую, чтобы соответственно получить сущность и получить список всех видимых сущностей:

public virtual TEntity Get(int id)
{
    return Session.Get<TEntity>(id);
}

public IEnumerable<Player> GetAllPlayersSortedByLastName(bool visible = true)
{
    return from player in Session.Linq<Player>()
            where player.Visible == visible
            orderby player.LastName
            select player;
}

Что не так с моим кодом? Почему сущность, которую я возвращаю из NH в моей модели основного вида после ее редактирования, не имеет правильных значений?

Заранее спасибо

1 Ответ

3 голосов
/ 07 июля 2010

Вы поддерживаете ISession в течение жизни каждой ViewModel?

Если дело обстоит так - сущность присутствует в IdentityMap ISession MainViewModel - поэтому, когда вы просите его обновить - она ​​просто берет тот, что в IdentityMap.

Вам нужно ISession.Evict (updatedEntity), а затем снова выполнить запрос.

Это вся идея кэша 1-го уровня в сеансе IS (чтобы не ударить базу данных, если она была ранее загружена.

Если вам не нужно это поведение и вы хотите обойти кэш первого уровня - вы можете открыть дочерний сеанс из сеанса или запустить в IStatelessSession.

...