我有一个简单的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的理解是有缺陷的,因为我预计这两个操作甚至可以并行工作.我是否需要锁定每个方法,以便它们一次只能出现一个?当然不是.有任何想法吗?
最佳答案 在这里找到答案
Managing EntityConnection lifetime.事实证明,为我的所有上下文重用相同的EntityConnection实例是个问题.所以现在我每次都要创建一个新的.