欢迎光临
个人技术文档整理

EF Core 保存时,表中有触发器发生的异常

问题:EF Core 保存时,表中有触发器发生的异常

Could not save changes because the target table has database triggers. Please configure your entity type accordingly
如果 DML 语句包含不带 INTO 子句的 OUTPUT 子句,则该语句的目标表 'Dz_QR' 不能具有任何启用的触发器。

 

解决方案

第一种:单个表或少量的表使用触发器
 

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Dz_QR>()
        .ToTable(tb => tb.HasTrigger("SomeTrigger"));
}

 

第二种:大面积的使用触发器
 

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
        {
            configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention()); 
        }
/// <summary>
    /// 如果大多数或所有表都有触发器,则可以使用以下模型生成约定,选择不对所有模型表使用更新、高效的技术
    /// </summary>
    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.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");
                    }
                }
            }
        }
    }

不要问我为什么要用触发器?因为业务需要,必须存在触发器。

 

参考

https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-7.0/breaking-changes#sqlserver-tables-with-triggers

 

赞(3)