nhibernate:为什么我的实体没有加载到一级缓存中?

nhibernate:为什么我的实体没有加载到一级缓存中?,nhibernate,caching,Nhibernate,Caching,我从同一个会话加载了一个实例两次,但是nhibernate返回了两个实例,我假设这意味着实体不在一级缓存中。什么会导致这种行为 测试: 更新 这种奇怪行为的原因是这一行代码: NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory(); 当我用这个工厂impl替换它时: ExistingSessionAwareUnitOfWorkFactory factory = new Exi

我从同一个会话加载了一个实例两次,但是nhibernate返回了两个实例,我假设这意味着实体不在一级缓存中。什么会导致这种行为

测试:

更新

这种奇怪行为的原因是这一行代码:

            NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory();
当我用这个工厂impl替换它时:

            ExistingSessionAwareUnitOfWorkFactory factory = new ExistingSessionAwareUnitOfWorkFactory(CreateUnitOfWorkFactory(), new NonTransactionalChildUnitOfWorkFactory());

它工作正常。

我只是在这里猜测,因为您没有包含存储库/UnitOfWork实现的代码。但在阅读这段代码时,您的存储库如何知道它应该针对哪个工作单元

第一级缓存位于会话级,我假设它保存在您的IUnitOfWork中。存储库上的唯一设置是工厂,因此我的下一个假设是Repository.Get()的代码正在实例化一个新会话并通过它加载对象。因此,对Get()的下一个调用将实例化另一个新会话并加载该对象。两个不同的1级缓存,检索到两个不同的对象


当然,如果您的UnitOfWork实际上正在封装事务,而工厂正在封装会话,那么这实际上并不适用:)

您的Repository.Get方法是什么样子的?在哪里使用uow实例?它是否用于存储库调用?My repository.Get看起来像(例如):使用(IUnitOfWork uow=workManager.CreateReadOnly()){..}事务和会话管理由工作单元工厂完成谢谢您的快速回复。我可以看出我在测试中使用了错误的工厂类型。我已经用正确的类型替换了它(如果已经存在一个会话,则会考虑该类型),并且它可以工作。
            ExistingSessionAwareUnitOfWorkFactory factory = new ExistingSessionAwareUnitOfWorkFactory(CreateUnitOfWorkFactory(), new NonTransactionalChildUnitOfWorkFactory());