4

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 つのみ発生するように、各メソッドをロックする必要がありますか? 確かにそうではありません。何か案は?

4

1 に答える 1

2

ここで答えを見つけましたEntityConnection ライフタイムの管理。すべてのコンテキストで同じ EntityConnection インスタンスを再利用することが問題であることが判明しました。だから今、私は毎回新しいものを作成します。

于 2012-08-29T12:08:54.903 に答える