【问题标题】:nhibernate: Why is my entity not loaded into the first level cache?nhibernate:为什么我的实体没有加载到一级缓存中?
【发布时间】:2010-01-19 03:03:01
【问题描述】:

我从同一个会话中加载了两次实例,但 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();

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

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

它按预期工作。

【问题讨论】:

  • 您的 Repository.Get 方法看起来如何?你在哪里使用 uow 实例?它是否在存储库调用中使用?
  • My Repository.Get 看起来像(例如): using (IUnitOfWork uow = workManager.CreateReadOnly()) { .. } 事务和会话管理由工作单元工厂完成

标签: nhibernate caching


【解决方案1】:

我只是在这里猜测,因为您没有包含 Repository/UnitOfWork 实现的代码。不过,阅读这段代码,您的存储库如何知道它应该针对哪个 UnitOfWork 采取行动?

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

当然,如果你的 UnitOfWork 实际上是在封装 Transaction,而 Factory 是在封装 Session,那么这实际上并不适用 :)

【讨论】:

  • 感谢您的快速回复。我可以看到我在测试中使用了错误类型的工厂。我已经用正确的类型替换了它(如果已经存在会话)并且它可以工作。
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2012-12-16
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多