2

次のように DBContext を介して呼び出されるストアド プロシージャがあります。

using (var transScope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0)))
{
   using (var db = new IceCreamEntities(connectionString, null, null))
   {
      db.CallMyProc(dateTime);
      var num = db.SaveChanges();
   }
   transScope.Complete();
}

編集: proc は、渡された日時値と DB で既知のその他の情報に基づいて、いくつかの行を削除します。

プロシージャは確実に機能します - 私の統合テストでは、プロシージャの実行後にテーブルに適切な行数があることを確認していますが、影響を受ける行数に対して常に 0 が返されます。

アイデア?

私は実行しています: EF 4.3、MySQL 5.5.28、MySQL コネクタ 6.5.4


解決済み:以下の私の回答を参照してください。

4

1 に答える 1

0

解決済み:

答えは、db.SaveChanges() の戻り値を無視し、代わりにプロシージャ自体の呼び出しによって返された値を使用することでした。したがって、今は次のようになります。

using (var transScope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0)))
{
   using (var db = new IceCreamEntities(connectionString, null, null))
   {
      var num = db.CallMyProc(dateTime);  //<<<<<< set it here instead
      db.SaveChanges();
   }
   transScope.Complete();
}

テストにバグがあり、db.CallMyProc 呼び出しでも 0 が返されたため、呼び出しが影響を受けた行数を返したという事実が隠されていました。

なぜ SaveChanges がそうでないのかはまだわかりません。

于 2013-01-08T15:48:13.297 に答える