2010-07-07 68 views
0

我的富客户端应用程序中出现了一个奇怪的问题。这里有一些背景:获取在另一个会话中被修改的实体时出现问题

  • 我使用每个视图模型一个会话。
  • 我的观点模型与Mediator彼此沟通。

我有一个管理视图模型,其中显示我的实体列表。我可以编辑一个实体,导致打开一个新的视图模型,该模型接收通过介体编辑的实体的ID。

当用户点击编辑按钮时,我的编辑视图模型会使用自己的会话更新实体,并再次使用媒体编辑器和编辑的实体标识来要求主视图模型刷新实体列表。

比方说,我更改了实体上名为Visible的布尔属性。

当我编辑实体时,我可以看到对NHibernate的UPDATE调用,更新数据库中的实体。

等我回来时在主视图模型,我做两件事情:

  1. 我从NHibernate的要求更新实体
  2. 我刷新实体的列表,显示所有的实体,与自定义过滤器。 (显示所有例如可见的实体。)

有什么奇怪的是,我从NH在第一时间拿到指令的实体仍然具有Visible属性的旧值,但在我看到的实体列表中,实体我已经编辑不存在...

这里是仓库的两个功能我用它来分别获得实体,并得到所有可见的实体列表:

public virtual TEntity Get(int id) 
{ 
    return Session.Get<TEntity>(id); 
} 

public IEnumerable<Player> GetAllPlayersSortedByLastName(bool visible = true) 
{ 
    return from player in Session.Linq<Player>() 
      where player.Visible == visible 
      orderby player.LastName 
      select player; 
} 

这有什么错我的代码?为什么我在主视图模型编辑后从NH返回的实体没有正确的值?

在此先感谢

回答

3

你在每个视图模型的终身保持的Isession活着吗?

如果是这种情况 - 实体存在于MainViewModel的ISession的IdentityMap中 - 所以当您要求它刷新时 - 它只抓取IdentityMap中的一个。

你需要ISession.Evict(updatedEntity)然后再次运行你的查询。

这是ISession的(第1级缓存的整体思路,如果它先前已加载未命中数据库

如果不希望这种行为,并希望绕过一级高速缓存 - 你可以从会话中打开子会话 - 或者在IStatelessSession中运行。

+1

或ISession.Refresh(obj)。 – 2010-07-07 13:04:06

+0

我已经在我的主视图模型中使用了无状态会话。 但我解决了我的问题,通过做Session.Get (entityId),然后Session.Refresh(entity),就像Jamie说的。 – Mike 2010-07-07 13:32:21

相关问题