0

我正在使用 Ayende 的 NHibernate Linq 版本 2.1.2,可在此处获得,并且当我使用 NHProf 检查使用此方法的查询时:

public IQueryable<T> GetAll()
{
    return Session.Linq<T>();
}

它给了我一个警告,我正在使用隐式事务。问题是,我在存储库中使用它来抽象出数据库会话,但我仍然想要返回 IQueryable 的灵活性,这样我就可以运行我想要的任何 Linq 查询。有没有办法Session.Linq<T>()在不暴露的情况下显式地将其包装在事务中,或者在这种情况下我应该忽略警告吗?

多一点背景。我正在使用这样的方法:

var repo = new Repository();
var animals = repo.GetAll<Animal>().Where(x => x.Size > 100);
NoahsArk.LargeAnimals.AddRange(animals);
4

3 回答 3

3

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

Ayende 在博客文章中解释了这一点:NH Prof Alerts:不鼓励使用隐式事务

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

于 2009-12-20T18:23:07.420 回答
1

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

我在我的 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();
    }
}

然后我可以将我的 linq 语句包装在 using 块中

    using (var linq = Linq())
    {
        var versions = from t in linq.Linq
                       where t.BaseName == BaseName
                       orderby t.Version descending
                       select t.Version;

        return versions.Take(1).SingleOrDefault();
    }

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

于 2011-07-19T11:33:34.750 回答
0

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

你能看到NHProf中的交易吗?

http://groups.google.com/group/nhprof/browse_thread/thread/fbc97d3286ad783b

于 2009-12-20T14:33:40.997 回答