2014-02-11 67 views
19

我有更新我的EF英孚到6.0.2在我的代码我有下面的代码行:更改数据库中的实体框架6

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

更新我收到以下错误消息后

在多语句 事务中不允许ALTER DATABASE语句。

我有一个TransctionalBehavior像下面的代码解决了这一问题:

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

我的问题:

  • 为什么我得到这个错误与EF 6?
  • 我的修复程序是针对该问题或隐藏在此解决方案后面的恶魔的有效修复程序?
  • 有没有其他解决问题的方法?

任何帮助将不胜感激!?

+0

感谢张贴的解决方案,那是我确切的问题也是如此。 – Woland

回答

17

EF 6变化事务的使用与ExecuteSqlCommand

与实体框架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

谢谢,真的很有帮助。 –

5

如果使用代码优先的方法可能的解决方案是

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

    public override void Down() 
    { 

    } 
} 
+0

从我+1,因为你是一个新的SO而不是为了答案;-)问题1)没有在迁移2)它来自嵌套事务。我知道上面的代码可以工作,但是当你把它放在嵌套事务中时,它会导致同样的问题。 –