NHibernate Linq использует неявную транзакцию?
Я использую 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);
3 ответа
У меня была очень похожая проблема, которую я решил довольно просто.
Я создал LinqClass в своем репозитории, возвращенном моим методом Linq
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 (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, но он должен работать аналогично для других вещей.
Сообщение NHProf на самом деле не связано с вашей реализацией репозитория. Это просто указывает на то, что вы выполняете запрос вне транзакции, что может стать источником проблем.
Айенде объясняет это в своем блоге: NH Prof Alerts: использование скрытых транзакций не рекомендуется
Вы должны управлять своими транзакциями с более высокого уровня в вашем приложении. Есть несколько способов сделать это при использовании репозиториев, взгляните на unhaddins
Я уверен, что вы можете игнорировать это предупреждение.
Вы видите транзакцию в NHProf?
http://groups.google.com/group/nhprof/browse_thread/thread/fbc97d3286ad783b