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端,或者使用时间线,那么我们必须尝试其中一种方法