NHibernate: уже есть открытый DataReader, связанный с этим соединением, который должен быть закрыт в первую очередь.

У меня проблема с загрузкой данных NHibernate из базы данных MySQL. Когда я запускаю этот код (и это единственный раз, когда создается сеанс NHibernate), он выдает исключение при первом }. Исключение составляет:

«Уже есть открытый DataReader, связанный с этим соединением, который должен быть закрыт в первую очередь».

Я не знаю, почему это происходит?

   // ----snip----

        var sessionFactory = NHibernateSessionHelper.CreateSessionFactory();
        using (var session = sessionFactory.OpenSession())
        {
            using (session.BeginTransaction())
            {
                _timeRecords = session
                    .CreateQuery(
                        "select tr from TimeRecord as tr where tr.Billable = true and tr.InvoiceDate is null and tr.CheckedOn is not null")
                    .Enumerable<TimeRecord>();
            } // Exception is thrown here
        }

   // ----snip----

class NHibernateSessionHelper
{
    public static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(
                MySQLConfiguration
                    .Standard.ConnectionString(c => c
                                                        .Server("db01.redknot.nl")
                                                        .Database("todo_youngguns_nl")
                                                        .Username("youngguns.nl")
                                                        .Password(""))
                    .ShowSql()
            )
            .Mappings(m =>
                      m.FluentMappings.AddFromAssemblyOf<UserMap>())
            .BuildSessionFactory();
    }
}

person Martijn de Munnik    schedule 11.11.2011    source источник
comment
бросает ли .Enumerable<TimeRecord>(); -> .List<TimeRecord>();?   -  person Firo    schedule 11.11.2011
comment
Кажется, это решает проблему! Спасибо.   -  person Martijn de Munnik    schedule 11.11.2011


Ответы (1)


.Enumerable<>() открывает Datareader и держит его открытым, пока удаление транзакции пытается отправить откат. Провайдер MySQL не может использовать соединение, пока открыто устройство чтения данных.

person Firo    schedule 11.11.2011