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

时间:2010-01-18 18:44:22

标签: nhibernate caching

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

测试:

        using (new TransactionScope())
        {
            // arrange
            NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory();
            const int WorkItemId = 1;
            const string OriginalDescription = "A";

            WorkItemRepository repository = new WorkItemRepository(factory);
            WorkItem workItem = WorkItem.Create(WorkItemId, OriginalDescription);
            repository.Commit(workItem);

            // act

            using (IUnitOfWork uow = factory.Create())
            {
                workItem = repository.Get(WorkItemId);
                WorkItem secondInstance = repository.Get(WorkItemId);

                // assert
                Assert.AreSame(workItem, secondInstance);
            }
        }

更新

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

            NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory();

当我用这个工厂impl替换它时:

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

它按预期工作。

1 个答案:

答案 0 :(得分:2)

我只是在猜测,因为你没有包含Repository / UnitOfWork实现的代码。但是,阅读这段代码,您的存储库如何知道应该对哪个UnitOfWork进行操作?

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

当然,如果您的UnitOfWork实际上封装了Transaction,并且Factory正在封装Session,那么这实际上并不适用:)