我正在从同一个会话加载一个实例两次,但是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());
它按预期工作。
答案 0 :(得分:2)
我只是在猜测,因为你没有包含Repository / UnitOfWork实现的代码。但是,阅读这段代码,您的存储库如何知道应该对哪个UnitOfWork进行操作?
第一级缓存位于会话级别,我假设它保存在您的IUnitOfWork中。存储库中唯一的设置是Factory,所以我的下一个假设是repository.Get()的代码实例化一个新的Session并通过它加载对象。因此,下一次调用Get()将实例化另一个新Session并加载该对象。两个不同的1级缓存,检索到两个不同的对象。
当然,如果您的UnitOfWork实际上封装了Transaction,并且Factory正在封装Session,那么这实际上并不适用:)