首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Entity Framework 6中更改数据库

在Entity Framework 6中更改数据库
EN

Stack Overflow用户
提问于 2014-02-11 18:21:33
回答 2查看 7.4K关注 0票数 22

在我的代码中,我已经将EF更新到EF 6.0.2,我有以下代码行:

代码语言:javascript
复制
 applicationDbContext.Database .ExecuteSqlCommand(@"ALTER DATABASE
 CURRENT SET RECOVERY FULL;");

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

多语句事务中不允许使用

ALTER DATABASE语句。

我已经用如下代码的TransctionalBehavior修复了这个问题:

代码语言:javascript
复制
applicationDbContext.Database.ExecuteSqlCommand(
TransactionalBehavior.DoNotEnsureTransaction, @"ALTER DATABASE CURRENT SET RECOVERY FULL;");

我的问题是:

  • 为什么EF 6会出现此错误?
  • 我的修复程序是对此问题的有效修复,还是隐藏在此解决方案背后的魔鬼?
  • 是否有其他方法来解决此问题?

如有任何帮助,将不胜感激!?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-22 02:36:38

EF 6改变了事务与ExecuteSqlCommand的使用

从Entity Framework6.0开始,ExecuteSqlCommand()默认情况下会将命令包装在事务中(如果还不存在的话)。此方法的重载允许您根据需要重写此行为。

EF5则不是这样的。您的修复是适当的。

您现在可以指定一个TransactionalBehavior标志来指示EF如何使用此命令处理事务。

代码语言:javascript
复制
var sqlCommand = String.Format("ALTER DATABASE {0} SET SINGLE_USER 
                                WITH ROLLBACK IMMEDIATE");
db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, 
                              sqlCommand);

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

票数 20
EN

Stack Overflow用户

发布于 2016-10-13 18:50:15

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

代码语言:javascript
复制
public partial class AlterDatabase : DbMigration
{
    public override void Up()
    {                                           
        Sql("ALTER DATABASE CURRENT SET RECOVERY FULL", true);
    }

    public override void Down()
    {

    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21699075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档