5

LinqToSqlInvalidOperationExceptionを使用して行を追加しようとすると、エラーが発生します。社内で複製することはできません。データベースへの比較的単純な変更で、約 0.06% 発生するのは 1 人のお客様だけです。(単一行の挿入、または単一フィールドの更新)

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() によって行われたデータベースの更新が実際に行われています。この例外は、トランザクションが正常に完了した後に呼び出され、データベース行が新しい値に更新されます。

4

1 に答える 1

0

注意すべき点の1つは、LinqToSql(およびEntityFramework)がデフォルトでデータオブジェクトのフィールドに割り当てnullられるため、テーブルにフィールドがある場合、datacontextがそのnull値を挿入しようとすると、挿入時に例外がスローされることです。DateTimedatetime

このエラーを回避するにはdatetime2、MSSQLの型(オブジェクトの「null」値を許可しDateTimeます- )を使用するか、挿入/更新の前に01/01/0001データオブジェクトのフィールドに有効な日付を手動で割り当てます。DateTime

より詳細なスタックトレースがなければ、これが頭に浮かぶ唯一の明らかな問題です。HTH。

編集:

これは完全に珍しいことではないようです:http://connect.microsoft.com/VisualStudio/feedback/details/588676/system-data-linq-datacontext-submitchanges-causes-invalidoperationexception-during-rollback#details

根本的な問題は、LinqToSqlが使用する内部ADOロジックが、トランザクションのロールバックを処理するために実際に適切に構成されていないことであると思われます。私が言えることから、唯一の本当の解決策は、LinqToSqlにトランザクションオブジェクトを提供し、ロールバックを自分で管理することですが、これはそれほど魅力的ではないようです。

于 2013-03-11T19:12:54.993 に答える