C# NHibernate事务中的读取操作

C# NHibernate事务中的读取操作,c#,nhibernate,transactions,C#,Nhibernate,Transactions,根据,强烈建议NHibernate使用事务,甚至用于读取操作。我不确定何时进行数据提取。 假设我们有一个简单的MSQL服务器数据库读取操作: var topics = _topicRepository.Read(0, 10); 其中,主题存储库的read方法仅返回值的枚举: public IEnumerable<Topic> Read(int beginIndex, int amount) { return _session.Query<Topic>().Ski

根据,强烈建议NHibernate使用事务,甚至用于读取操作。我不确定何时进行数据提取。 假设我们有一个简单的MSQL服务器数据库读取操作:

var topics = _topicRepository.Read(0, 10);
其中,主题存储库的read方法仅返回值的枚举:

public IEnumerable<Topic> Read(int beginIndex, int amount)
{
    return _session.Query<Topic>().Skip(beginIndex).Take(amount);
}

调用ToList()将立即发出数据库请求(这意味着NHibernate应该运行事务,它将包含单个读取操作),而不是提交什么?这难道不是一种新的内部交易吗?提前感谢您的解释。

阅读操作将立即进行。如果你想推迟它们,你应该考虑使用<代码>。
此外,在使用nhibernate时,请务必阅读此内容(以及其中的其他部分)。

在交易中明确包装它们的目的是什么?在交易结束时,您所有的期货都将通过到dbWell的一次往返来执行,使用
ToFuture()是否是最佳解决方案
并在
Begin()
Commit()
中包装对DB的每个调用?急切抓取似乎使处理事务对象变得多余,不是吗?一般来说,事务作为一个结构,可以在一批中更新,也可以在一批中下载。一批更新意味着,如果某些更新失败,您可以控制“全有或全无”场景。下载意味着您可以更好地处理缓存,当然批量下载本身的性能在事务结束时,是在往返发生时,因此如果您使用futures,那么您确实需要在事务中进行包装。否则,您将得到与IQueryable类似的对象—它们包含查询,但不包含实际数据
transaction.Begin();
var topics = _topicRepository.Read(0, 10).ToList();
transaction.Commit();