我在这个问题中讨论的实体和映射可以找到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,但我仍然得到这个例外。
有人知道如何解决这个问题吗?
提前致谢
麦克
答案 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)
好吧,我刚刚发现了这个问题。
为了更新团队的玩家列表,我在更新实体之前清除了列表并添加了新玩家。
现在,我通过删除并添加仅被用户移动的玩家来更新列表,现在我没有任何问题。
这很奇怪。我以前不知道到底出了什么问题,但至少现在还不行。