【解决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 配置

如果针对单个表,可以添加
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());
        }**
    }
}

 

posted on 2024-08-16 09:21  _一级菜鸟  阅读(20)  评论(0编辑  收藏  举报