不允许新事务,因为会话中正在运行其他线程

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 下,所有其他请求将使用它.