2017-12-13 6 views
3

リストをループし、リスト内のすべての項目に対してストアドプロシージャを実行しようとしています。Entity Frameworkはループ内でストアドプロシージャを実行します

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())); 
} 

私は、次のエラーを取得しておいてください。

New transaction is not allowed because there are other threads running in the session.

私も非同期メソッドを使用しようとしました。しかし、それはうまくいかないようでした。私が紛失しているものがありますか?または、ループ内でストアドプロシージャを実行することはできませんか?

+0

は他のスレッドと同じように、あなたのコンテキストで何かをしますか? –

+1

[Entity Frameworkのループ内にストアドプロシージャを挿入する]の可能な複製(https://stackoverflow.com/questions/40984421/entity-framework-insert-stored-procedure-in-a-loop) –

+0

@ArjunPrakashはい、ありますこのエラーがミスリーディングである記録されたインスタンス –

答えて

2

おそらく、デシベルコールが内部コール機能を停止し、トランザクションをオープンしました。

.ToList()をコールして、valuesを入力してすべての値を先にロードしてみてください。

+0

@Rainmanの答えはおそらくまたこの問題を解決しますが、それはかなりの接続を食べるかもしれません –

0

実行ごとに新しいContextインスタンスを作成する方が良い場合があります。 valuesを移入する

  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())); 
       } 
      } 
関連する問題