Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不允许新事务,因为会话中正在运行其他线程。实体框架_C#_Entity Framework_Linq - Fatal编程技术网

C# 不允许新事务,因为会话中正在运行其他线程。实体框架

C# 不允许新事务,因为会话中正在运行其他线程。实体框架,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个简单的代码: foreach(var myvar in _sdb.Vars) { myvar.Area= AreaCheck(myvar); _sdb.Entry(myvar).State = System.Data.Entity.EntityState.Modified; _sdb.SaveChanges(); } 运行此代码时,会出现以下异常: 不允许新事务,因为存在其他线程 正在会话中运行 我用谷歌搜索了这个问题,其中一个答案告诉我要改变这一行: for

我有一个简单的代码:

foreach(var myvar in _sdb.Vars)
{
    myvar.Area= AreaCheck(myvar);

    _sdb.Entry(myvar).State = System.Data.Entity.EntityState.Modified;
    _sdb.SaveChanges();
}
运行此代码时,会出现以下异常:

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

我用谷歌搜索了这个问题,其中一个答案告诉我要改变这一行:

foreach(var myvar in _sdb.Vars)
foreach(var myvar in _sdb.Vars.ToList())
关于这一行:

foreach(var myvar in _sdb.Vars)
foreach(var myvar in _sdb.Vars.ToList())

但当我这么做的时候,代码根本不起作用。我怎样才能做到这一点?谢谢。

在迭代后保存,如下所示

using (var _sdb = new MyContext())
{
    foreach (var myvar in _sdb.Vars)
    {
        // Change myvar
    }
     //save at the end
    _sdb.SaveChanges();
}

var myvar在_sdb.Vars
中将抛出错误,因为
sdb.Vars
IQueryable
并且您正在尝试修改它的状态
foreach(在_sdb.Vars.ToList()中的var myvar)
应该可以工作,但这取决于您在
AreaCheck(myvar)
方法中执行的操作。请添加该代码。另外,移动
\u sdb.SaveChanges()
foreach
循环之外,以避免多个数据库命中“但当我这样做时,代码根本不起作用”-怎么起作用?数据库中有300000条记录。这仍然有效吗?这将适用于小数据集,如果这是大数据集,那么最好将它们作为块获取。。请检查这个asnwer,或者干脆不要使用ORMs来处理这类事情。只需使用类似于存储过程的方法告诉您的数据库服务器。@CodeNotFind是的,这将是一个更好的解决方案,但我们不知道OP的确切要求。如果OP在更新时更多地依赖ORM数据,并且在这种情况下无法将所有内容移动到db端,或者使用时间线,那么我们必须尝试其中一种方法