改变实体框架6中的数据库

Bas*_*ili 21 entity-framework

我在我的代码中将EF更新为EF 6.0.2我有以下代码行:

 applicationDbContext.Database .ExecuteSqlCommand(@"ALTER DATABASE
 CURRENT SET RECOVERY FULL;");
Run Code Online (Sandbox Code Playgroud)

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

多语句事务中不允许使用ALTER DATABASE语句.

我修复了TransctionalBehavior的问题,如下面的代码:

applicationDbContext.Database.ExecuteSqlCommand(
TransactionalBehavior.DoNotEnsureTransaction, @"ALTER DATABASE CURRENT SET RECOVERY FULL;");
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 为什么我在使用EF 6时出现此错误?
  • 我的修复是对问题的有效修复还是隐藏在此解决方案背后的魔鬼?
  • 有没有其他方法可以解决这个问题?

任何帮助将不胜感激!?

Eri*_* J. 20

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);
Run Code Online (Sandbox Code Playgroud)

通过使用DoNotEnsureTransaction标志,EF将不会在执行命令之前启动事务.这允许ALTER DATABASE命令成功执行.


小智 7

如果您使用Code First方法可能的解决方案是

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

    public override void Down()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)