Информация об изменениях

Сообщение DbConnection.CreateCommand и локальная транзакция от 27.05.2018 18:48

Изменено 27.05.2018 18:57 DDDX

DbConnection.CreateCommand и локальная транзакция
Хочу посоветоваться.

Должен ли DbConnection.CreateCommand привязывать создаваемую команду к активной локальной транзакции?

Я вот смотрю на поведеление System.Data.OleDb — не привязывает.

И если попробовать запрос через такую команду — генерируется ошибка.

 {
  var cn=new xdb.OleDbConnection(TestServices.Conf__GetCnStr());

  cn.Open();

  using(var tr=cn.BeginTransaction())
  {
   var cmd=cn.CreateCommand();

   Assert.That(cn,Is.Not.Null);

   Assert.That(cmd.Connection,Is.SameAs(cn));

   Assert.IsNull(cmd.Transaction); // НЕ ПРИВЯЗЫВАЕТ

   cmd.CommandText="select ID from DUAL";

   var rd=cmd.ExecuteReader(); // КИДАЕТ ИСКЛЮЧЕНИЕ

   rd.Close();
  }//using tr
 }


System.InvalidOperationException : ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано.


По-моему это не логичное поведение.

Потому что, если куда-то передали объект подключения для выполнения работы, то там не должны париться по поводу того есть локальная транзакция или её нету.

Тем более что DbConnection не предоставляет возможности определить наличие локальной транзакции — у него нет свойства типа CurrentTransaction.

Собственно говоря, я напоролся на эту проблему, передавая подключение с активной локальной транзакцией внутрь EntityFrameworkCore — он там юзает DbConnection.CreateCommand и (ясный пень) не привязывает полученную команду к этой локальной транзакции.
DbConnection.CreateCommand и локальная транзакция
Хочу посоветоваться.

Должен ли DbConnection.CreateCommand привязывать создаваемую команду к активной локальной транзакции?

Я вот смотрю на поведение System.Data.OleDb — не привязывает.

И если попробовать запрос через такую команду — генерируется ошибка.

 {
  var cn=new xdb.OleDbConnection(TestServices.Conf__GetCnStr());

  cn.Open();

  using(var tr=cn.BeginTransaction())
  {
   var cmd=cn.CreateCommand();

   Assert.That(cn,Is.Not.Null);

   Assert.That(cmd.Connection,Is.SameAs(cn));

   Assert.IsNull(cmd.Transaction); // НЕ ПРИВЯЗЫВАЕТ

   cmd.CommandText="select ID from DUAL";

   var rd=cmd.ExecuteReader(); // КИДАЕТ ИСКЛЮЧЕНИЕ

   rd.Close();
  }//using tr
 }


System.InvalidOperationException : ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано.


По-моему это нелогичное поведение.

Потому что, если куда-то передали объект подключения для выполнения работы, то там не должны париться по поводу того есть локальная транзакция или её нету.

Тем более что DbConnection не предоставляет возможности определить наличие локальной транзакции — у него нет свойства типа CurrentTransaction.

Собственно говоря, я напоролся на эту проблему, передавая подключение с активной локальной транзакцией внутрь EntityFrameworkCore — он там юзает DbConnection.CreateCommand и (ясный пень) не привязывает полученную команду к этой локальной транзакции.