先詳細說下我的版本:軟體開發版本是EF Core 7.0
問題:EF Core 儲存時,表中有觸發器發生的異常。
報錯為:: 如果 DML 語句包含不帶 INTO 子句的 OUTPUT 子句,則該語句的目標表 ‘XXX’ 不能具有任何啟用的觸發器。
查詢解決方案找到了
EF Core 7.0 (EF7) 中的中斷性變更
https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-7.0/breaking-changes#sqlserver-tables-with-triggers
這個解決方案我嘗試了一下,可以解決以上問題。下面將問題說下:
具有觸發器或某些計算列的 SQL Server 表現在需要特殊的 EF Core 配置
如果針對單個表,可以新增
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .ToTable(tb => tb.HasTrigger("SomeTrigger")); }
如果針對多個表則使用
namespace OMEntityFramework.DBContext { **public class BlankTriggerAddingConvention : IModelFinalizingConvention { public virtual void ProcessModelFinalizing( IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context) { foreach (var entityType in modelBuilder.Metadata.GetEntityTypes()) { var table = StoreObjectIdentifier.Create(entityType, StoreObjectType.Table); if (table != null && entityType.GetDeclaredTriggers().All(t => t.GetDatabaseName(table.Value) == null) && (entityType.BaseType == null || entityType.GetMappingStrategy() != RelationalAnnotationNames.TphMappingStrategy)) { entityType.Builder.HasTrigger(table.Value.Name + "_Trigger"); } foreach (var fragment in entityType.GetMappingFragments(StoreObjectType.Table)) { if (entityType.GetDeclaredTriggers().All(t => t.GetDatabaseName(fragment.StoreObject) == null)) { entityType.Builder.HasTrigger(fragment.StoreObject.Name + "_Trigger"); } } } } }** public class OMDbContext : DbContext { **protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention()); }** } }