NHibernate Linq使用隐式事务?
我使用的是Ayende的NHibernate Linq版本2.1.2(可用),当我使用NHProf检查使用此方法的查询时: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
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抽象出来的。