首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我什么时候需要刷新Rhino Commons UnitOfWork?

我什么时候需要刷新Rhino Commons UnitOfWork?
EN

Stack Overflow用户
提问于 2009-03-19 15:14:03
回答 2查看 1.2K关注 0票数 2

在使用Rhino Commons UnitOfWork (在ASP的UnitOfWorkApplication中)时,我喜欢使用Rhino Repository静态类来保存实体,如下所示:

代码语言:javascript
复制
Repository<Car>.Save(new Car(Id = 1));

然后,我发现可以在调用之后立即使用以下命令获取实体:

代码语言:javascript
复制
Car car = Repository<Car>.Get(1);

这可以很好地工作。但是,当我在Rhino UnitOfWork上使用Rhino Linq提供程序时,如下所示:

代码语言:javascript
复制
var allCars = (from rep in UnitOfWork.CurrentSession.Linq<Car>()
               select rep).ToList();

我得到了一个空的列表。看起来我必须先调用UnitOfWork.Current.Flush(),然后才能像这样把车弄出来。我不明白为什么,在幕后,我假设两种检索方法都在查询相同的会话/工作单元。这是否意味着您应该在每次保存到数据库后调用UnitOfWork.Current.Flush()?NHibernate不是应该能够计算出何时刷新自己吗?还是我误解了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-25 17:00:18

好的,看起来虽然对Repository的Get调用可以使用会话缓存,因此可以“看到”缓存中保存的car:

代码语言:javascript
复制
Car car = Repository<Car>.Get(1); // This works because it uses the same session

linq查询不使用会话缓存:

代码语言:javascript
复制
var allCars = (from rep in UnitOfWork.CurrentSession.Linq<Car>()               
select rep).ToList(); // Does not work, even if it is in the same code block and even though it uses the same session

因此,最佳实践是任何数据库更改(保存、更新、删除、插入)都应遵循以下步骤:

代码语言:javascript
复制
UnitOfWork.Session.Flush(), 

或者封装在一个:

代码语言:javascript
复制
With.Transaction(delegate{
   // code here
})

或者用交易来装饰你的方法,使用自动取款机。这将确保后续的linq查询将查找最新数据。

票数 2
EN

Stack Overflow用户

发布于 2009-03-20 11:48:09

多亏了Stuart Childs,我怀疑他是对的,问题可能出在NHibernate Linq提供程序上。我不确定它在幕后做了什么,但它可能会使用不同的会话,如果它使用了,那么在Linq查询“看到”它之前,我必须刷新存储库保存是有意义的。是时候浏览一下源代码了,但有人告诉我,如果我试图理解它,它会让我的头脑融化的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/662572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档