Подтвердить что ты не робот

Изменение базы данных в Entity Framework 6

Я обновил свой EF до EF 6.0.2 в своем коде. У меня есть следующая строка кода:

 applicationDbContext.Database .ExecuteSqlCommand(@"ALTER DATABASE
 CURRENT SET RECOVERY FULL;");

После обновления появляется следующее сообщение об ошибке:

Атрибут ALTER DATABASE не допускается в рамках нескольких заявлений сделка.

Я исправил проблему с помощью TranscendalBehavior, как и код ниже:

applicationDbContext.Database.ExecuteSqlCommand(
TransactionalBehavior.DoNotEnsureTransaction, @"ALTER DATABASE CURRENT SET RECOVERY FULL;");

Мой вопрос:

  • Почему я получаю эту ошибку с EF 6?
  • Мое исправление является допустимым исправлением проблемы или дьяволом, скрывающимся за этим решением?
  • Есть ли другой подход к решению проблемы?

Любая помощь будет принята с благодарностью!?

4b9b3361

Ответ 1

EF 6 изменяет использование транзакций с помощью ExecuteSqlCommand

Начиная с Entity Framework 6.0, ExecuteSqlCommand() по умолчанию переносит команду в транзакцию, если ее еще нет. Есть перегрузки этого метода, которые позволяют вам переопределить это поведение, если хотите.

EF 5 не ведет себя одинаково. Ваше исправление подходит.

Теперь вы можете указать флаг TransactionalBehavior, чтобы проинструктировать EF о том, как обрабатывать транзакции с помощью этой команды.

var sqlCommand = String.Format("ALTER DATABASE {0} SET SINGLE_USER 
                                WITH ROLLBACK IMMEDIATE");
db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, 
                              sqlCommand);

Используя флаг DoNotEnsureTransaction, EF не запускает транзакцию перед выполнением команды. Это позволяет успешно выполнить команду ALTER DATABASE.

Ответ 2

Если вы используете подход Code First, возможно решение

public partial class AlterDatabase : DbMigration
{
    public override void Up()
    {                                           
        Sql("ALTER DATABASE CURRENT SET RECOVERY FULL", true);
    }

    public override void Down()
    {

    }
}