Изменение базы данных в 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?
- Мое исправление является допустимым исправлением проблемы или дьяволом, скрывающимся за этим решением?
- Есть ли другой подход к решению проблемы?
Любая помощь будет принята с благодарностью!?
Ответы
Ответ 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()
{
}
}