2016-11-23 57 views
0

我正在使用實體框架。 這是我的了方法:C#EntityFramework Up方法¿如果sql在中間失敗怎麼辦?

public override void Up() 
    { 
     AddColumn("Users", "atribute21", c => c.String(unicode: false)); 

     Sql("wrong sql command"); 
    } 

我intencionally寫不好的SQL命令,該點是將要執行的將是SQL代碼:

alter table `Users` add column `atribute21` longtext 
wrong sql command 

所以實體框架將執行第一sql語句並在我的數據庫中更改屬性「atribute21」,但在此之後它將失敗並且表__migrationhistory不會被修改。

所以,實際上Entity框架變成了不一致的狀態。使用update命令對數據庫進行了一些更改,但遷移未完成。實際上,我甚至可以不使用update-database TargetMigration進行回滾:「遷移」或更新數據庫或任何其他內容。

解決此問題的唯一方法是手動刪除用戶表中的「atribute21」,刪除錯誤的sql代碼並再次遷移。這個例子中的這個解決方案非常簡單,但它不具有可伸縮性,例如,如果我在up方法中填充了30個sql命令以填充數據庫中的數據,並且其中一個失敗,那怎麼辦?

¿我如何使用實體框架從此恢復?

Â不應該在實體框架中默認的up方法是一個sql事務嗎?

¿如何配置實體框架以實現up方法將成爲sql事務?

注意: 我發現在up方法中添加sql begin和sql end是一種方法,但我認爲這不是一個好的解決方案,我希望自動執行某些操作。

編輯:當您使用Microsoft SQL Server

自動回滾up方法存在的,但我使用MySQL/MariaDB的,並不會發生。

+0

我認爲發生回滾... –

+1

@IgorQuirino我試過了,回滾沒有發生,即使update-database命令失敗,數據庫也會被修改。 –

+0

還請記住,您應該使用Down()代碼來反轉遷移。 –

回答

0

「我如何使用實體框架從此恢復?」

「如何配置實體框架以實現up方法將成爲sql事務?」

使用的TransactionScope嘗試

using System.Transactions; 

代碼:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    try 
    { 
     //Do whatever 

     transaction.Complete(); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

「不應該up方法在實體框架默認情況下,SQL事務?」

  • @IgorQuirino我嘗試過了,不會發生回滾,數據庫甚至與更新的數據庫命令失敗修改。
  • 所以,不...

高興地幫助你!

相關問題