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
управлять еговремя жизни или есть шаблон для подражания?
РЕДАКТИРОВАТЬ:
Эксперименты показывают, что если я просто оставлю его открытым, он будет вести себя хорошо иавтоматически учитывает внешнюю транзакцию, если таковая имеется.Однако я бы предпочел твердый совет по этому поводу.