【解决DML 语句包含不带 INTO 子句的 OUTPUT 子句】
EF Core触发器问题
先详细说下我的版本:软件开发版本是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 配置
如果针对单个表,可以添加
先详细说下我的版本:软件开发版本是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()); }** } }