2014-02-11 91 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)它來自嵌套事務。我知道上面的代碼可以工作,但是當你把它放在嵌套事務中時,它會導致同樣的問題。 –