NHibernate Linq使用隐式事务?

NHibernate Linq使用隐式事务?,nhibernate,transactions,linq-to-nhibernate,nhprof,Nhibernate,Transactions,Linq To Nhibernate,Nhprof,我使用的是Ayende的NHibernate Linq版本2.1.2(可用),当我使用NHProf检查使用此方法的查询时: public IQueryable<T> GetAll() { return Session.Linq<T>(); } public IQueryable GetAll() { return Session.Linq(); } 它警告我正在使用隐式事务。问题是,我在存储库中使用它来提取数据库会话,但我仍然希望能够灵活地返回IQueryab

我使用的是Ayende的NHibernate Linq版本2.1.2(可用),当我使用NHProf检查使用此方法的查询时:

public IQueryable<T> GetAll()
{
    return Session.Linq<T>();
}
public IQueryable GetAll()
{
return Session.Linq();
}
它警告我正在使用隐式事务。问题是,我在存储库中使用它来提取数据库会话,但我仍然希望能够灵活地返回IQueryable,这样我就可以运行我想要的任何Linq查询。有没有办法在事务中显式包装
会话.Linq()
,而不公开它,或者在这种情况下我应该忽略警告

多一点背景知识。我使用的方法如下:

var repo = new Repository();
var animals = repo.GetAll<Animal>().Where(x => x.Size > 100);
NoahsArk.LargeAnimals.AddRange(animals);
var repo=new Repository();
var anies=repo.GetAll(),其中(x=>x.Size>100);
诺亚方舟。大型动物。AddRange(动物);

我很确定您可以忽略此警告

你能在NHProf中看到交易吗


我很确定你可以忽略这个警告

你能在NHProf中看到交易吗


NHProf的消息实际上与您的存储库实现无关。它只是指出您在事务之外运行查询,这可能是问题的根源

Ayende在一篇博客文章中解释了这一点:


您应该从应用程序的更高级别管理事务。使用存储库时有几种方法可以做到这一点,请看一看NHProf的消息实际上与您的存储库实现无关。它只是指出您在事务之外运行查询,这可能是问题的根源

Ayende在一篇博客文章中解释了这一点:


您应该从应用程序的更高级别管理事务。在使用存储库时,有几种方法可以做到这一点,看看

我有一个非常类似的问题,我很简单地解决了这个问题

我在由Linq方法返回的存储库中创建了一个LinqClass

public virtual LinqClass Linq()
{
    return new LinqClass(Session, LinqSource());
}

public class LinqClass : IDisposable
{
    public LinqClass(ISession session, IQueryable<T> linqSource)
    {
        _linq = linqSource;
        _transaction = session.BeginTransaction();
    }
    private readonly IQueryable<T> _linq;
    private readonly ITransaction _transaction;

    public IQueryable<T> Linq
    {
        get { return _linq; }
    }

    public void  Dispose()
    {
         _transaction.Commit();
    }
}

即使从中间返回数据,事务提交仍然被调用。没有更多的隐式事务。显然,这个例子是针对NHibernate的,但对于其他事情,它也应该同样适用。

我有一个非常类似的问题,我很简单地解决了这个问题

我在由Linq方法返回的存储库中创建了一个LinqClass

public virtual LinqClass Linq()
{
    return new LinqClass(Session, LinqSource());
}

public class LinqClass : IDisposable
{
    public LinqClass(ISession session, IQueryable<T> linqSource)
    {
        _linq = linqSource;
        _transaction = session.BeginTransaction();
    }
    private readonly IQueryable<T> _linq;
    private readonly ITransaction _transaction;

    public IQueryable<T> Linq
    {
        get { return _linq; }
    }

    public void  Dispose()
    {
         _transaction.Commit();
    }
}

即使从中间返回数据,事务提交仍然被调用。没有更多的隐式事务。显然,这个例子是针对NHibernate的,但对于其他事情,它也应该同样适用。

谢谢。它还允许您在一个事务中对数据库运行多个语句,以提高效率。我的实际实现稍微复杂一些,因为我还使用了一个事务类型参数来更好地控制我的事务孤岛级别,等等,我是从NH抽象出来的。它还允许您在一个事务中对数据库运行多个语句,以提高效率。我的实际实现稍微复杂一些,因为我还使用了一个事务类型参数来更好地控制我的事务孤岛级别,等等,我是从NH抽象出来的。