刷新实体会引发NHibernate.UnsolvableObjectException

刷新实体会引发NHibernate.UnsolvableObjectException,nhibernate,session,refresh,Nhibernate,Session,Refresh,我在这个问题中讨论的实体和映射可以找到:) 以下是上下文: 我有一个父视图模型,它可以帮助管理一些实体,并且有自己的会话 从这个VM,我打开另一个视图模型(也有自己的会话),对实体进行一些更改(添加和/或删除子项),当我验证更改时,我提交会话并警告第一个视图模型刷新显示: public void Validate() { using (var tx = Session.BeginTransaction()) { try {

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

以下是上下文:

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

从这个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);
        }
    }
}
在刷新行引发异常:

NHibernate.unsolvableObjectException

信息是:

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

我可以多次打开和更改实体,但当我删除一个子实体,然后添加另一个子实体,最后删除另一个子实体时,似乎会引发异常

在web上阅读了一些内容之后,这似乎是因为当我刷新实体时,以及因为我更改了HasMany关系(例如,因为我删除了一个播放器),NH尝试重新加载删除的行

我尝试在映射中的HasMany上添加NotFound.Ignore语句,我尝试强制对DB进行新查询,而不是加载,但仍然出现此异常

有人知道我该怎么解决这个问题吗

提前谢谢


Mike

这是使用修改的集合刷新对象时的已知行为

若要强制重新加载,请将方法更改为执行
会话。将实体作为参数逐出
。这是我们在基本模型类中使用的代码:

public T ReGet<T>(T entity) where T : IEntity
{
    var id = entity.Id;
    Session.Evict(entity);
    return Session.Get<T>(id);
}
public T ReGet(T实体),其中T:entity
{
var id=entity.id;
会议.驱逐(实体);
返回会话.Get(id);
}

这是使用修改的集合刷新对象时的已知行为

若要强制重新加载,请将方法更改为执行
会话。将实体作为参数逐出
。这是我们在基本模型类中使用的代码:

public T ReGet<T>(T entity) where T : IEntity
{
    var id = entity.Id;
    Session.Evict(entity);
    return Session.Get<T>(id);
}
public T ReGet(T实体),其中T:entity
{
var id=entity.id;
会议.驱逐(实体);
返回会话.Get(id);
}

我刚刚发现了问题

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

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


这很奇怪。我不知道以前出了什么问题,但至少现在起作用了。

我刚刚发现了问题所在

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

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


这很奇怪。我不知道以前出了什么问题,但至少现在起作用了。

为什么不将正在使用的会话传递给“child”视图模型?我认为这将解决问题并防止重新获取集合。因为我尝试应用ayende建议的方法:为什么不将正在使用的会话传递给“child”viewmodel?我认为这将解决问题并防止重新获取集合。因为我尝试应用ayende建议在此处执行的操作:如果另一个对象持有对旧对象的引用(现在被逐出),会发生什么情况对象,并对其进行更改。然后我得到一个UnuniqueObjectException,表示我有两个相同ID的对象。您知道在这种情况下该怎么办吗?谢谢。如果另一个对象修改了现在被逐出的对象,则不会发生任何事情(也不会更新任何内容)。当然,如果调用
session.Update(oldObject)
显然,它可能会失败。解决方案是…不这样做:-)被逐出的对象应被视为不存在。因此,我需要找到对被逐出对象的所有引用,并将其替换为新引用。谢谢。如果其他对象持有对旧对象(现在被逐出)的引用,会发生什么对象,并对其进行更改。然后我得到一个UnuniqueObjectException,表示我有两个相同ID的对象。您知道在这种情况下该怎么办吗?谢谢。如果另一个对象修改了现在被逐出的对象,则不会发生任何事情(也不会更新任何内容)。当然,如果调用
session.Update(oldObject)
显然,它可能会失败。解决方案是…不这样做:-)被逐出的对象应该被视为不存在。因此,我需要找到所有对被逐出对象的引用,并将其替换为新对象。谢谢。