Это упрощенный пример, но показывает ошибку, с которой я сталкиваюсь. Я пытаюсь запустить в транзакции две команды, обе из которых имеют параметры.
Пример
using (var db = new BloggingContext())
{
using (IDbContextTransaction t = db.Database.BeginTransaction())
{
using (var cmd = (IDbCommand) new SqlCommand())
{
cmd.CommandText = "CREATE TABLE [#sessionlist] (Id bigint);" +
"Insert into #sessionlist " +
"select BlogId from blogs " +
"where rating >= 10";
cmd.CommandType = CommandType.Text;
var p = cmd.CreateParameter();
p.ParameterName = "rating";
p.Value = 10;
cmd.Parameters.Add(p);
cmd.Connection = db.Database.GetDbConnection();
cmd.Transaction = t.GetDbTransaction();
cmd.ExecuteNonQuery();
}
using (var cmd = (IDbCommand) new SqlCommand())
{
cmd.CommandText = "update blogs set rating = @rating where BlogId in (select * from #sessionList)";
cmd.CommandType = CommandType.Text;
var p = cmd.CreateParameter();
p.ParameterName = "rating";
p.Value = 10;
cmd.Parameters.Add(p);
cmd.Connection = db.Database.GetDbConnection();
cmd.Transaction = t.GetDbTransaction();
cmd.ExecuteNonQuery();
}
t.Commit();
}
}
Выполнение этой команды завершается неудачно с недопустимым именем объекта #sessionlist, так как кажется, что он не выполняется в той же транзакции. Если в первом cmd изменен, то параметры НЕТ добавляются, а вместо этого параметр жестко закодирован. Это выполняется нормально.
Как выполнить несколько команд в одной транзакции, каждая из которых имеет свои параметры?
Рабочий код является более сложным и требует, чтобы обе команды были разделены, так как он создает тяжелую временную таблицу, на которую ссылается вторая команда.