【发布时间】: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