【解決DML 語句包含不帶 INTO 子句的 OUTPUT 子句】

_一级菜鸟發表於2024-08-16
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());
        }**
    }
}

相關文章