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