Как упомянуто выше «Парусное дзюдо», я с большим успехом использовал блоки TransactionScope, когда мне нужно вызывать хранимые прокы. Однако есть одна «ошибка», с которой я столкнулся, когда возникает исключение, говорящее, что «транзакция под вопросом». Чтобы обойти это, я должен был вызвать метод nondeferred в proc, чтобы он немедленно оценивал результат. Так что вместо
using (var transaction = new TransactionScope())
{
var db = new dbDataContext();
db.StoredProc();
transaction.Complete();
}
Я должен был назвать это так ...
using (var transaction = new TransactionScope())
{
var db = new dbDataContext();
db.StoredProc().ToList();
transaction.Complete();
}
В этом примере ToList () может быть любым неотложенным методом, который заставляет LINQ немедленно оценить результат.
Я предполагаю, что это потому, что ленивый (отложенный) характер LINQ плохо играет со временем транзакции, но это только предположение. Если бы кто-нибудь мог пролить больше света на это, я бы хотел услышать об этом.