Mar*_*tin 8 ado.net entity-framework-4
获取"不允许新事务,因为会话中正在运行其他线程".
它与foreach循环或任何人通常与此消息一起出现问题无关.
我在整个请求中使用带有repositoy模式和公共上下文的EF4.有些事情发生了,无法准确确定是什么,只要我尝试使用上下文保存变更,跨请求,我就会收到此消息,并且只有在我回收应用程序池后才会消失.
我关闭连接了吗?我该怎么说?我是否为每个请求使用了新的上下文?是.
这是怎么回事?有解决方法吗?
编辑:(上下文工厂)
private static Dictionary<string, CoinEntities> _instances;
public static CoinEntities DefaultInstance
{
get
{
if (HttpContext.Current == null)
{ //todo: mock instead. testing.
if (!Instances.ContainsKey("_TEST"))
Instances["_TEST"] = new CoinEntities();
return Instances["_TEST"];
}
if (!Instances.ContainsKey("_DEFAULT"))
Instances["_DEFAULT"] = new CoinEntities();
return Instances["_DEFAULT"];
}
}
Run Code Online (Sandbox Code Playgroud)
Lad*_*nka 16
我不认为这只是没有处置上下文的问题(上下文不保持打开的事务 - 你会因为未提交的更改而看到它).如果您遇到此问题,则很可能不会在每个请求中使用新的上下文实例,或者您对共享上下文实例(=一个连接)进行了多线程/异步处理.此异常表示多个线程(可能是多个已处理的请求)正在尝试在同一连接上使用自己的事务 - 这是不可能的.
角落案例可以手动处理提供给上下文的连接,但我想如果你使用它,你会提到它.
编辑:
您的工厂不提供每个请求上下文 - 它为所有请求提供单个上下文!该静态字典在所有请求之间共享,因此第一个创建实例并将其存储在_DEFAULTkey 下,所有其他请求将使用它.