我已在我的代码中将EF更新为EF 6.0.2我有以下代码行:
applicationDbContext.Database .ExecuteSqlCommand(@"ALTER DATABASE
CURRENT SET RECOVERY FULL;");
更新后,我收到以下错误消息:
多语句中不允许使用ALTER DATABASE语句 事务。
我已经修复了TransctionalBehavior的问题,如下面的代码:
applicationDbContext.Database.ExecuteSqlCommand(
TransactionalBehavior.DoNotEnsureTransaction, @"ALTER DATABASE CURRENT SET RECOVERY FULL;");
我的问题:
任何帮助将不胜感激!?
答案 0 :(得分:19)
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命令成功执行。
答案 1 :(得分:6)
如果您正在使用Code First方法,可能的解决方案是
public partial class AlterDatabase : DbMigration
{
public override void Up()
{
Sql("ALTER DATABASE CURRENT SET RECOVERY FULL", true);
}
public override void Down()
{
}
}