Какой шаблон следовать, когда я вручную открываю соединение в DataContext - PullRequest
1 голос
/ 13 января 2012

Linq2Sql не поддерживает табличные параметры для хранимых процедур ( 1 , 2 ).

Из-за этого я добавляю некрасивую поддержкутабличные параметры в моем DataContext (просто для того, чтобы все было согласованно и при этом можно было вызывать мои процедуры из одного контекста данных).

Я вызываю this.Connection.CreateCommand(), приведите его к SqlCommand (потому что этов любом случае будет SqlCommand для поддержки TVP), вручную перечислите все параметры, включая SqlDbType.Structured и ExecuteNonQuery it.

Это прекрасно работает.
Но.
Внутри моеговспомогательный метод, я должен открыть контекстное соединение, потому что оно может быть закрыто. Поскольку я открываю соединение вручную, нужно ли его закрывать вручную?

Я прошел через это:
Нужно ли вручную закрывать соединение SQL, если яиспользовать Linq?
Когда я должен избавиться от контекста данных
Когда начинается подключение к базе данных, если я использую DataContext?

, ноони на самом деле не отвечают на мой вопрос.Я понимаю, что соединение закрывается при перечислении результата, но это более сложно, чем это.Вызов метода не является операцией только для чтения, в отличие от перечисления результатов.
Кроме того, при наличии внешней транзакции DataContext определенно не закроет соединение после первого вызова метода:

using (var ambient_tran = new System.Transactions.TransactionScope())
{
    using (var dx = new SomeDataContext()) 
    {
        dx.CallMethodOne(foo, bar);
        dx.CallMethodTwo(bar, baz); // executed on same connection and same transaction,
                                    // can see uncommitted data entered by CallMethodOne
    }

    ambient_tran.Complete();
};

Из-за всего этого я не уверен, что нужно сделать в отношении соединения.
Мне просто открыть соединение и оставить DataContext управлять еговремя жизни или есть шаблон для подражания?


РЕДАКТИРОВАТЬ:

Эксперименты показывают, что если я просто оставлю его открытым, он будет вести себя хорошо иавтоматически учитывает внешнюю транзакцию, если таковая имеется.Однако я бы предпочел твердый совет по этому поводу.

1 Ответ

0 голосов
/ 13 сентября 2012

Если вам не нужны распределенные транзакции, избегайте использования System.Trasactions.Вместо этого, посмотрите мой TextMetal проект, пример кода и обратите внимание на пространство имен Plumbing.Если у вас есть вопросы, напишите мне.Без MSDTC, просто правильно сгенерированный ADO.NET/LINQ to SQL, шаблон рабочей единицы и некоторый хорошо спроектированный код доступа к данным!

Если есть веская причина для использования System.Transactions, тогдаЯ советую вам все же закрыть соединение как можно скорее, так как координатор транзакций будет управлять фиксацией / откатом после того, как соединение будет выпущено в пул.

...