今天把專案從 Entity Framework Core 6 升級到 Entity Framework Core 7 後,一執行就出現下面的錯誤:
如果是英文訊息應該是:
依據官方文件說明 EF Core 7 現在使用更高效的技術來儲存變更,但若有資料庫觸發器 (trigger) 則無法使用。
反正就是如果該資料表有使用 trigger ,就會拋出上面的例外,除非有標記使用觸發器,就會使用舊的技術儲存,雖然比較慢但不會拋出例外可以正常執行。
但是對於有數百張表和幾十個 trigger 的專案,要一一找到和對應真的是太麻煩了!所以最好的解決方式就是使用 EF 的 dotnet ef dbcontext scaffold 指令同步資料庫至程式中:
詳細指令請查看官方說明文件
參考資料:
Microsoft.Learn - SQL Server tables with triggers or certain computed columns now require special EF Core configuration
Microsoft.Data.SqlClient.SqlException (0x80131904): 如果 DML 陳述式包含 OUTPUT 子句但不含 INTO 子句,陳述 式的目標資料表 'table' 就不可以有任何啟用的觸發程序。
如果是英文訊息應該是:
The target table of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.
依據官方文件說明 EF Core 7 現在使用更高效的技術來儲存變更,但若有資料庫觸發器 (trigger) 則無法使用。
反正就是如果該資料表有使用 trigger ,就會拋出上面的例外,除非有標記使用觸發器,就會使用舊的技術儲存,雖然比較慢但不會拋出例外可以正常執行。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable(tb => tb.HasTrigger("SomeTrigger"));
}
但是對於有數百張表和幾十個 trigger 的專案,要一一找到和對應真的是太麻煩了!所以最好的解決方式就是使用 EF 的 dotnet ef dbcontext scaffold 指令同步資料庫至程式中:
dotnet ef dbcontext scaffold Name=ConnectionStrings:DefaultConnection Microsoft.EntityFrameworkCore.SqlServer --data-annotations --context-dir Data --force
詳細指令請查看官方說明文件
參考資料:
Microsoft.Learn - SQL Server tables with triggers or certain computed columns now require special EF Core configuration
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com