BLToolkit с Linq Почему требуется оператор `using`?

В свете недавних (крайних) проблем с производительностью SubSonic 3, мы стремимся перенести ORM, желательно переписав как можно меньше кода (в основном это Linq).

Так что я смотрю на BLToolkit. Одно из основных различий, которое я вижу между SubSonic и BLToolkit, заключается в том, что BLToolkit всегда требует оператора using. Например:

static void SingleTableTest()
{
    using (var db = new NorthwindDB()) //This
    {
        var query =
            from e in db.Employee
            where e.EmployeeID > 5
            orderby e.LastName, e.FirstName
            select e;

        foreach (var employee in query)
        {
            Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName);
        }
    }
}

Что именно это делает? Когда вы создаете новый экземпляр базы данных, создает ли он новое соединение? Было бы разумно «обернуть» это в статический класс, чтобы я мог делать из любого места var q=from e in Database.Employee ...? Какие последствия это будет иметь в контексте веб-приложения?


person Earlz    schedule 28.06.2011    source источник
comment
Это связано с идеей о том, что соединения должны ограничиваться наименьшей возможной единицей работы. Я не знаком с этой структурой в частности, но вполне вероятно, что они управляют вашими соединениями для вас так же, как EF или LinqToSql.   -  person Brian Dishaw    schedule 28.06.2011
comment
Согласно моему представлению о коде, для каждого оператора new db создается новое соединение. Я посмотрел в SubSonic, и они использовали самодельный SharedConnectionScope, чтобы соединения открывались и закрывались автоматически.   -  person Earlz    schedule 28.06.2011
comment
Это может каждый раз создавать новый экземпляр объекта подключения к базе данных, но это не должно создавать совершенно новое сетевое подключение к серверу базы данных. .NET по умолчанию создает пул соединений.   -  person Joe White    schedule 28.06.2011
comment
@ Джо, так что тогда не о чем беспокоиться? То есть создание нескольких объектов базы данных на HTTP-запрос? (конечно, предпочтительно использовать одно и то же соединение, когда это возможно)   -  person Earlz    schedule 28.06.2011
comment
Пул соединений позаботится об использовании одного и того же сетевого соединения, когда это возможно. Но вам нужен блок using, чтобы пул соединений знал, что вы закончили с первым объектом соединения (и сетевым соединением, которое он инкапсулирует) и готов к повторному использованию.   -  person Joe White    schedule 28.06.2011


Ответы (2)


Я предполагаю, что класс NorthwindDB в вашем примере основан на DbManager. DbManager является оболочкой Connection и ведет себя как соединение. Вам следует попробовать другой класс — DataContext. Он разработан именно для вашего сценария.

person IT.    schedule 29.06.2011
comment
Есть ли способ заставить шаблоны T4 (включенные в BLtoolkit) генерировать расширенный DataContext, аналогичный тому, как расширяется DbManager? - person Earlz; 30.06.2011
comment
В вашем шаблоне просто добавьте BaseDataContextClass = DataContext; перед Загрузкой Метаданных(); / ГенерироватьМодель(); - person IT.; 30.06.2011

Я не знаю BLToolkit, но из вашего комментария, в котором говорилось, что вы хотели знать, можно ли просто использовать один объект для каждого HTTP-запроса с чем-то вроде Entity Framework, вы можете это сделать. Вместо оператора using вы создаете объект db в событии Application_BeginRequest global.asax. Вы избавляетесь от него в Application_EndRequest. Вы можете сохранить объект в HttpContext.Current.Items, который является удобной коллекцией для каждого запроса.

Как я уже сказал, я не знаю, относится ли это конкретно к BLToolkit, потому что я ничего о нем не знаю, но, надеюсь, этого достаточно, чтобы указать вам правильное направление. :)

person Tridus    schedule 28.06.2011
comment
Что ж, похоже, ты можешь это сделать... может быть. Проблема только в том, что он держит SqlReader открытым. Возможно, мне просто повезет попробовать и посмотреть, не сломается ли что-нибудь. - person Earlz; 29.06.2011