Entity Frameworkの使用に関しては、すべて同じパターンを持ついくつかのメソッドを持つ単純なASP.NETホストWCFサービスがあります...
public void Operation1(string username)
{
using(MyEFContext context = new MyEFContext())
{
UserInfo info = (from ui in context.UserInfos
where ui.User.Equals(username)
select ui).FirstOrDefault<UserInfo >();
info.LastAccess = DateTime.Now;
// Operation specific code, such as getting information using the EF context
context.SaveChanges();
}
}
これは、例を単純にするために簡略化したバージョンですが、この単純なバージョンでも、私の製品コード セットと同じエラーが発生します。このコードは、Entity Framework を使用してユーザー情報を取得することから始まり、ユーザーの LastAccess フィールドを更新してから、操作固有のコードを実行します。操作固有のコードは、情報のクエリを作成するだけです。最後に SaveChanges を呼び出して、LastAccess をデータベースに保存します。クライアントが2つの呼び出しを並行して行うまで、これはすべて完全に正常に機能します。
クライアントは、それぞれ異なる操作に対して 2 つの呼び出しを行いますが、どちらも上記のコード パターンと同じです。両方の呼び出しが成功する場合があります。しかし、それ以外の場合は、そのうちの 1 つがエラーとして生成され、次の 3 つのいずれかである可能性があります...
System.Data.EntityException: The underlying provider failed on Open. --->
System.InvalidOperationException: The connection was not closed. The connection^s current
state is connecting.
System.Data.EntityCommandExecutionException: An error occurred while executing the command
definition. See the inner exception for details. ---> System.InvalidOperationException:
ExecuteReader requires an open and available Connection. The connection^s current state is
closed.
System.InvalidOperationException: Invalid attempt to read when no data is present.
EF と ASP.NET に関する私の理解には明らかに欠陥があります。なぜなら、2 つの操作が並行して機能することを期待していたからです。一度に 1 つのみ発生するように、各メソッドをロックする必要がありますか? 確かにそうではありません。何か案は?