C# 实体框架在循环中执行存储过程

C# 实体框架在循环中执行存储过程,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我试图循环遍历一个列表,并对列表中的每个项目执行一个存储过程 foreach(value in values) { Context.Database .ExecuteSqlCommand( "sp_ProcedureName @value1, @value2, @value3", new SqlParameter("@value1", value.value1.ToString()), new Sql

我试图循环遍历一个列表,并对列表中的每个项目执行一个存储过程

foreach(value in values) {
    Context.Database
        .ExecuteSqlCommand(
            "sp_ProcedureName @value1, @value2, @value3",
            new SqlParameter("@value1", value.value1.ToString()),
            new SqlParameter("@value2", value.value2.ToString()),
            new SqlParameter("@value3", value.value3.ToString()));
}
我不断得到以下错误:

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


我也尝试使用异步方法。但这似乎不起作用。有什么我不知道的吗。或者不可能在循环中运行存储过程吗?

最好为每次执行创建新的
上下文
实例

            foreach (value in values)
            {
                using (var yourContext = new YourDbContext())
                {
                    yourContext.Database
                        .ExecuteSqlCommand(
                            "sp_ProcedureName @value1, @value2, @value3",
                            new SqlParameter("@value1", value.value1.ToString()),
                            new SqlParameter("@value2", value.value2.ToString()),
                            new SqlParameter("@value3", value.value3.ToString()));
                }
            }

也许填充
值的db调用打开了一个事务,停止了内部调用的运行


尝试在填充
值的调用中使用
.ToList()
,首先预加载所有值。

是否与其他线程一样,对您的上下文执行其他操作?可能重复@ArjunPrakash Yes,有记录的实例表明此错误是错误的。请注意:不应在存储过程中使用
sp_u
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!只是猜测:值是数据库调用的结果吗?您是否尝试过
ToList()
强制它加载所有数据?@Rainman answer可能也会解决此问题,但它可能会占用很多连接