获取已在另一个会话中修改的实体时出现问题

时间:2010-07-07 12:46:50

标签: nhibernate repository viewmodel

我的富客户端应用程序中存在一个奇怪的问题。以下是一些背景知识:

  • 每个视图模型使用一个会话。
  • 我的观看模型与Mediator
  • 相互沟通

我有一个管理视图模型,其中显示了我的实体列表。我可以编辑一个实体,这会打开一个新的视图模型,它接收要通过中介编辑的实体的id。

当用户点击“编辑”按钮时,我的编辑视图模型会使用自己的会话更新实体,并再次使用Mediator和编辑后的实体ID来请求主视图模型刷新实体列表。

假设我在实体上更改了名为Visible的布尔属性。

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

当我回到主视图模型时,我会做两件事:

  1. 我从NHibernate询问更新后的实体
  2. 我使用自定义过滤器刷新实体列表,以显示所有实体。 (例如,显示所有可见实体。)
  3. 奇怪的是,我在第一条指令中从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返回的实体没有正确的值?

    提前致谢

1 个答案:

答案 0 :(得分:3)

您在每个ViewModel的生命周期内保持ISession活着吗?

如果是这种情况 - 实体出现在MainViewModel的ISession的IdentityMap中 - 所以当你要求它刷新时 - 它只是抓住了IdentityMap中的那个。

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

这是ISession中第一级缓存的全部概念(如果先前已加载,则不会访问数据库。

如果您不想要此行为并希望绕过第一级缓存 - 您可以从会话中打开子会话 - 或者在IStatelessSession中运行。