2010-01-18 49 views
1

我从同一会话中两次加载一个实例,但是nhibernate返回两个我假设实例不在第一级缓存中的实例。什么会导致这种行为?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()); 

它按预期工作。

+0

请问你Repository.Get方法样子? 你在哪里使用uow实例?它是否在库调用中使用? – 2010-01-18 18:58:33

+0

我Repository.Get样子(为前): 使用(IUnitOfWork UOW = workManager.CreateReadOnly()){ .. } 交易和会话管理由工作工厂 – Marius 2010-01-18 19:11:56

回答

2

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

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

当然,如果你的UnitOfWork实际上是封装事务,以及工厂封装会话,那么这并不实际应用:)

+0

单位做谢谢为快速回复。我可以看到我在测试中使用了错误类型的工厂。我已经用正确的类型替换它(如果已经存在一个会话,它将会被尊重)并且它可以工作。 – Marius 2010-01-18 19:01:21

相关问题