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

Nhibernate 获取已在另一个会话中修改的实体时出现问题,nhibernate,repository,viewmodel,Nhibernate,Repository,Viewmodel,我的富客户端应用程序中有一个奇怪的问题。以下是一些背景: 每个视图模型使用一个会话 我的视图模型以一种简单的方式相互通信 我有一个管理视图模型,其中显示了我的实体列表。我可以编辑一个实体,从而打开一个新的视图模型,该模型通过中介接收要编辑的实体的id 当用户单击“编辑”按钮时,“我的编辑视图模型”将使用其自己的会话更新实体,并使用已编辑的实体id再次使用中介来请求主视图模型刷新实体列表 假设我更改了实体上名为Visible的布尔属性 编辑实体时,可以看到对NHibernate的更新调用,更新

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

  • 每个视图模型使用一个会话
  • 我的视图模型以一种简单的方式相互通信
我有一个管理视图模型,其中显示了我的实体列表。我可以编辑一个实体,从而打开一个新的视图模型,该模型通过中介接收要编辑的实体的id

当用户单击“编辑”按钮时,“我的编辑视图模型”将使用其自己的会话更新实体,并使用已编辑的实体id再次使用中介来请求主视图模型刷新实体列表

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

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

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

  • 我向NHibernate询问更新后的实体
  • 我使用自定义过滤器刷新实体列表以显示所有实体。(例如,显示所有可见图元。)
  • 奇怪的是,我在第一条指令中从NH获得的实体仍然具有Visible属性的旧值,但在我的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;
    }
    
    public虚拟内存获取(int-id)
    {
    返回会话.Get(id);
    }
    public IEnumerable GetAllPlayerSortedByLastName(bool visible=true)
    {
    从会话中的玩家返回。Linq()
    其中player.Visible==可见
    orderby player.LastName
    选择玩家;
    }
    
    我的代码怎么了?为什么编辑后从主视图模型中的NH返回的实体没有正确的值


    提前感谢

    您是否在每个ViewModel的生命周期内保持ISession活动

    如果是这种情况,则实体存在于MainViewModel的ISession的IdentityMap中,因此当您要求它刷新时,它只会获取IdentityMap中的实体

    您需要删除ISession.execute(updateEndity),然后再次运行查询

    这就是ISession中一级缓存的全部思想(如果数据库以前已加载,则不会命中数据库)


    如果您不希望出现这种行为,并且希望绕过一级缓存—您可以从会话中打开子会话—或者在ISTALESSSESSION中运行。

    在每个ViewModel的生命周期内,是否保持ISession处于活动状态

    如果是这种情况,则实体存在于MainViewModel的ISession的IdentityMap中,因此当您要求它刷新时,它只会获取IdentityMap中的实体

    您需要删除ISession.execute(updateEndity),然后再次运行查询

    这就是ISession中一级缓存的全部思想(如果数据库以前已加载,则不会命中数据库)


    如果您不希望出现这种行为,并且希望绕过一级缓存,则可以从会话中打开子会话,或者在IStatelessSession中运行。

    我已经在主视图模型中使用了无状态会话。但我通过执行session.Get(entityId)和session.Refresh(entity)解决了问题,正如Jamie所说。我已经在我的主视图模型中使用了无状态会话。但我通过执行session.Get(entityId)和session.Refresh(entity)解决了我的问题,正如Jamie所说。