刷新实体会引发NHibernate.UnsolvableObjectException
我在这个问题中讨论的实体和映射可以找到:) 以下是上下文: 我有一个父视图模型,它可以帮助管理一些实体,并且有自己的会话 从这个VM,我打开另一个视图模型(也有自己的会话),对实体进行一些更改(添加和/或删除子项),当我验证更改时,我提交会话并警告第一个视图模型刷新显示:刷新实体会引发NHibernate.UnsolvableObjectException,nhibernate,session,refresh,Nhibernate,Session,Refresh,我在这个问题中讨论的实体和映射可以找到:) 以下是上下文: 我有一个父视图模型,它可以帮助管理一些实体,并且有自己的会话 从这个VM,我打开另一个视图模型(也有自己的会话),对实体进行一些更改(添加和/或删除子项),当我验证更改时,我提交会话并警告第一个视图模型刷新显示: public void Validate() { using (var tx = Session.BeginTransaction()) { try {
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)
显然,它可能会失败。解决方案是…不这样做:-)被逐出的对象应该被视为不存在。因此,我需要找到所有对被逐出对象的引用,并将其替换为新对象。谢谢。