Обновление сущности вызывает исключение NHibernate.UnresolvableObjectException - PullRequest
0 голосов
/ 16 июля 2010

Сущности и отображения, о которых я говорю в этом вопросе, можно найти здесь :)

Вот контекст:

У меня есть родительская модель представления, которая помогает управлять некоторыми объектами и имеет собственный сеанс.

На этой виртуальной машине я открываю другую модель представления (также с собственным сеансом), делаю некоторые изменения в сущности (добавляю и / или удаляем дочерние элементы), и когда я проверяю изменения, я фиксирую сеанс и предупреждаю первая модель представления для обновления дисплея:

public void Validate()
{
    using (var tx = Session.BeginTransaction())
    {
        try
        {
            SelectedTeam.ClearRoster();

            foreach (var teamPlayer in TeamPlayers)
                SelectedTeam.AddPlayer(teamPlayer);

            teamsRepository.SaveOrUpdate(SelectedTeam);

            tx.Commit();
        }
        catch (Exception ex)
        {
            tx.Rollback();
        } 
        finally
        {
            if (tx.WasCommitted)
                ServiceLocator.Current.GetInstance<Mediator>().NotifyColleagues(MediatorMessages.DisplayEntityInfos, SelectedTeam.Id);
        }
    }
}

Вот неисправный метод родительской виртуальной машины:

public void RefreshEntitiesListAndDisplayEntityInfos(int selectedEntityId)
{
    TEntity entity = entitiesRepository.Load(selectedEntityId);
    Session.Refresh(entity);
    //...
}

Исключение выдается в строке обновления:

NHibernate.UnresolvableObjectException

И сообщение:

Строка с указанным идентификатором не существует [Emidee.CommonEntities.PlayerInTeam # 3

Я могу открывать и изменять сущность несколько раз, но создается впечатление, что исключение выдается, когда я удаляю дочернего элемента, затем добавляю другого и, наконец, удаляю другого.

После некоторых чтений в Интернете кажется, что когда я обновляю сущность, и потому что я изменил отношение HasMany (например, потому что я удалил игрока), NH пытается перезагрузить удаленную строку.

Я пытался добавить оператор NotFound.Ignore для HasMany в мои сопоставления, я пытался принудительно создать новый запрос к БД вместо Load, но я все еще получаю это исключение.

Кто-нибудь знает, как я мог это исправить?

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

Mike

Ответы [ 2 ]

4 голосов
/ 16 июля 2010

Это известное поведение при обновлении объектов с измененными коллекциями.

Для принудительной перезагрузки измените ваш метод на session.Evict с сущностью в качестве параметра.Вот код, который мы используем в классе нашей базовой модели:

public T ReGet<T>(T entity) where T : IEntity
{
    var id = entity.Id;
    Session.Evict(entity);
    return Session.Get<T>(id);
}
0 голосов
/ 17 июля 2010

Ну, я только что обнаружил проблему.

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

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

Это странно.Я не знаю, что было не так раньше, но как минимум это работает сейчас.

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