ここ数か月間、Entity Framework コードを最初に使用し、SQL Server CE を初めて使用してアプリケーションを開発してきました。私は 2 つの組み合わせが非常に便利であることに気付きました。私の古いやり方 (特に ADO.NET) と比較すると、非常に高速な開発時間を実現できます。
しかし、今朝、私と何人かの同僚が、SqlServer CE に関するどのドキュメントにも見られなかった問題に遭遇しました。一度に複数の挿入を処理することはできません!
この問題に遭遇するまでは、CE が私の選択のデータベースになるかもしれないという意見でした。これを発見した理由は、自分のアプリケーションで Web サービスに対して一度に複数のリクエストを行う必要があり、少しボトルネックが発生していたため、Parallel.Invoke
呼び出しを使用して複数のリクエストを行うことにしました。
アプリケーションのメッセージ ロギング サービスをオンにするまで、これはすべて正常に機能していました。この時点で、Web リクエストを行うときに次のエラーが発生し始めました。
A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlServerCe.SqlCeException: A duplicate value cannot be inserted into a unique index. [ Table name = Accounts,Constraint name = PK__Accounts__0000000000000016 ]
奇妙だと思いました。そして、私の最初の説明は、それは と関係があるに違いないということでしたDbContext
。おそらく、DbContext
私が使用していたのは静的であるか、クラスの他の何かRepository
が静的で問題を引き起こしていましたが、周りを嗅ぎ回った後、それは私のコードとは何の関係もないことを確信していました.
その後、同僚の注意を喚起し、しばらくして、それは SqlServer CE に違いないと判断されました。スレッドを使用して問題を再現しようとさまざまなテスト プロジェクトをセットアップした後、問題はほぼ毎回再現されました。Sql を使用すると、 Server Express 問題は発生していませんでした。
CEがこれほど単純なことを処理できないのは少し奇妙だと思います。つまり、問題はスレッドだけではないということです.2人のユーザーが同時にテーブルに挿入する可能性のあるWebアプリケーションには使用できないと言っています...狂気!
とにかく、他の誰かが私のようなプロジェクトに遅れて出くわし、このように機能することにショックを受けました (そしてイライラしました) かどうか疑問に思っていますか? また、なぜこのように制限されているのか、誰かが光を当てることができれば、それは素晴らしいことです.