我有一个使用 nhibernate 和 sqlite DB 用 c# 编写的应用程序。对于单元测试,我使用 xunit 和内存中的 sqlite db。
我知道当会话关闭时内存数据库被破坏,因此为了测试,我使用单个会话并在测试期间保持打开状态。在我的大多数测试中,这都很好。
但是,在少数情况下,我需要测试同时使用ISession
和的方法IStatelessSession
。经过一番研究,我决定采用与此处描述的方法类似的方法。所以IStatelessSession
是使用ISession
's 连接创建的,如下所示:
statelessSession = factory.OpenStatelessSession(existingSession.Connection);
问题是,一旦更改持久保存到数据库,这似乎会导致某种冲突。如果我与session.SaveOrUpdate(new Entity() {...})
then 进行交易,那很好,但如果我再做,statelessSession.Get<Entity>(1)
那么它将失败,并显示错误消息“集合与任何会话无关”。
通常,此错误表明会话已关闭,但在这种情况下,两个会话仍处于打开状态且处于活动状态。
如果我这样做session.Get<Entity>(1)
,它会按预期返回实体。最初,我认为这可能是因为会话和无状态会话在某种程度上不同步,所以我替换session.SaveOrUpdate..
并statelessSession.Insert(new Entity() {...})
重新运行了测试。奇怪的是,这并没有什么不同。常规会话仍然可以正常工作,并且 statelessSession 仍然损坏。