Linq DataContext SubmitChanges InvalidOperationException от ZombieCheck

Я получаю InvalidOperationException при попытке добавить строку с помощью LinqToSql. Мы не можем продублировать его самостоятельно, и это происходит примерно на 0,06% только для одного из наших клиентов, всегда с относительно простым изменением базы данных. (Вставка одной строки или обновление одного поля)

Message:
   This SqlTransaction has completed; it is no longer usable.
Stack Trace:
   at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)

Вот пример кода (база данных автоматически генерирует первичный ключ)

TableName row = new TableName();
row.Description = "something";
row.Action = "action";
Context.TableName.InsertOnSubmit(row);
Context.SubmitChanges();

Мы используем SQL Server 2008 R2. Вставки и обновления проходят через сервер. Но мы все еще получаем исключение. Нет ничего, что могло бы помешать этим обновлениям и вставкам. Никаких зависимостей и прочего.

Как мы можем предотвратить возникновение этих исключений / проверок / откатов зомби, или что вызывает их в первую очередь?

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

После дальнейшей проверки происходит обновление базы данных, которое выполняется SubmitChanges(). Это исключение вызывается после успешного завершения транзакции, и строка базы данных обновляется до нового значения.

1 ответ

Следует помнить, что LinqToSql (и EntityFramework) по умолчанию назначают null в DateTime поля в ваших объектах данных, поэтому, если ваша таблица имеет datetime поле будет выдавать исключение при вставке, если datacontext попытается вставить это нулевое значение.

Вы можете обойти эту ошибку, используя datetime2 введите MSSQL (что позволит "нулевое" значение DateTime объект - 01/01/0001) или вручную назначить правильную дату для объекта данных DateTime поле (поля) до вставки / обновления.

Без более подробной трассировки стека это единственная очевидная проблема, которая приходит на ум. НТН.

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

Похоже, это не является чем-то необычным: http://connect.microsoft.com/VisualStudio/feedback/details/588676/system-data-linq-datacontext-submitchanges-causes-invalidoperationexception-during-rollback

Похоже, корень проблемы в том, что внутренняя логика ADO, которую использует LinqToSql, на самом деле не настроена должным образом для обработки откатов транзакций. Из того, что я могу сказать, единственное реальное решение - предоставить объект транзакции LinqToSql и самостоятельно управлять откатами, что на самом деле не кажется таким уж привлекательным.

Другие вопросы по тегам