刷新实体会抛出NHibernate.UnresolvableObjectException

时间:2010-07-16 18:51:03

标签: nhibernate session refresh

我在这个问题中讨论的实体和映射可以找到here:)

以下是上下文:

我有一个父视图模型,它有助于管理一些实体,并且有自己的会话。

从这个VM,我打开另一个视图模型(也有自己的会话),对实体做一些更改(添加和/或删除子项),当我验证更改时,我提交会话并警告第一个用于刷新显示的视图模型:

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);
        }
    }
}

以下是父VM的故障方法:

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

刷新行抛出异常:

NHibernate.UnresolvableObjectException

信息是:

不存在具有给定标识符的行[Emidee.CommonEntities.PlayerInTeam#3

我可以多次打开并更改实体,但是当我删除一个子项,然后添加另一个子项,最后删除另一个子项时,似乎抛出了异常。

在网上阅读了一些内容后,似乎是因为当我刷新实体,并且因为我更改了HasMany关系(因为我删除了一个播放器)时,NH尝试重新加载已删除的行。

我试图在我的映射中在HasMany上添加一个NotFound.Ignore语句,我试图强制一个新的查询到数据库而不是一个Load,但我仍然得到这个例外。

有人知道如何解决这个问题吗?

提前致谢

麦克

2 个答案:

答案 0 :(得分:4)

使用修改后的集合刷新对象时,这是一种已知行为。

要强制重新加载,请将您的方法更改为session.Evict,并将实体作为参数。这是我们在基础模型类中使用的代码:

public T ReGet<T>(T entity) where T : IEntity
{
    var id = entity.Id;
    Session.Evict(entity);
    return Session.Get<T>(id);
}

答案 1 :(得分:0)

好吧,我刚刚发现了这个问题。

为了更新团队的玩家列表,我在更新实体之前清除了列表并添加了新玩家。

现在,我通过删除并添加仅被用户移动的玩家来更新列表,现在我没有任何问题。

这很奇怪。我以前不知道到底出了什么问题,但至少现在还不行。