У меня была очень похожая проблема, которую я решил довольно просто.
Я создал 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, но он должен работать аналогично для других вещей.