不允许实体框架新事务,因为在会话中运行其他线程,多线程保存

and*_*rea 11 c# multithreading savechanges entity-framework-4

我试着在DB上保存多线程processo的日志,但是我收到以下错误:不允许新事务,因为会话中还有其他线程在运行.

在每个胎面我都有这个功能:

 internal bool WriteTrace(IResult result, string message, byte type)
    {
        SPC_SENDING_TRACE trace = new SPC_SENDING_TRACE(
                        message,
                        Parent.currentLine.CD_LINE,
                        type,
                        Parent.currentUser.FULLNAME,
                        Parent.guid);
        Context.SPC_SENDING_TRACE.AddObject(trace);
        if (Context.SaveChanges(result) == false)
            return false;
        return true;

    }
Run Code Online (Sandbox Code Playgroud)

每个线程的Context都不同,但与DB的连接始终是相同的.

有没有办法解决这个问题?

谢谢Andrea

eca*_*ver 37

你应该为每个事务创建一个上下文然后处理它,你可以这样做:

using(var ctx = new MyContext()) {
    //do transaction here
}
Run Code Online (Sandbox Code Playgroud)

在关闭的括号之后,处理上下文.

为了更好地理解,请参阅这篇文章,您可以通过ken2k找到一个很好的答案.希望你能解决你的问题:)

更新:

您还应该尝试添加.ToList()到您拥有的每个LINQ查询.迭代LINQ结果时,在迭代完成之前不能进行任何更改.检查您是否有类似的东西或共享更多代码,即您调用的代码段WriteTrace.希望这次这实际上对你有所帮助.

  • 我有这个错误,因为我使用的是一个引用集合context.classname的循环.一旦我添加'ToList()',错误就停止了. (3认同)