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可能也会解决此问题,但它可能会占用很多连接