NHibernate Linq использует неявную транзакцию? - PullRequest
0 голосов
/ 20 декабря 2009

Я использую 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 ]

3 голосов
/ 20 декабря 2009

Сообщение NHProf на самом деле не связано с вашей реализацией репозитория. Это просто указывает на то, что вы выполняете запрос вне транзакции, что может стать источником проблем.

Айенде объясняет это в своем блоге: NH Prof Alerts: использование скрытых транзакций не рекомендуется

Вы должны управлять своими транзакциями с более высокого уровня в вашем приложении. Есть несколько способов сделать это при использовании репозиториев, посмотрите на unhaddins

1 голос
/ 19 июля 2011

У меня была очень похожая проблема, которую я решил довольно просто.

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

0 голосов
/ 20 декабря 2009

Я почти уверен, что вы можете игнорировать это предупреждение.

Видите ли вы транзакцию в NHProf?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...