我正在使用實體框架。 這是我的了方法: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的,並不會發生。
我認爲發生回滾... –
@IgorQuirino我試過了,回滾沒有發生,即使update-database命令失敗,數據庫也會被修改。 –
還請記住,您應該使用Down()代碼來反轉遷移。 –