4

我有一个简单的 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();
    }
}

这是一个简化版本以保持示例简单,但即使是这个简单版本也与我的生产代码集存在相同的错误。该代码首先使用实体​​框架获取用户信息,更新用户 LastAccess 字段,然后执行特定于操作的代码。特定于操作的代码只是查询信息。最后它调用 SaveChanges 以便将 LastAccess 保存回数据库。现在这一切都很好,直到我的客户同时拨打两个电话。

客户端进行两次调用,每次调用不同的操作,但它们都具有与上面所见相同的代码模式。有时两个电话都成功完成。但有时其中一个会产生错误,它可能是以下三个中的任何一个......

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 的理解是有缺陷的,因为我希望这两个操作甚至可以并行工作。我是否需要锁定每种方法,以便它们一次只发生一个?肯定不是。有任何想法吗?

4

1 回答 1

2

在这里找到答案管理 EntityConnection 生命周期。事实证明,为我的所有上下文重用相同的 EntityConnection 实例是问题所在。所以现在我每次都创建一个新的。

于 2012-08-29T12:08:54.903 回答