Entity Framework Core 7 觸發程序(trigger) 例外 解決方式

今天把專案從 Entity Framework Core 6 升級到 Entity Framework Core 7 後,一執行就出現下面的錯誤:
    
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

留言