随笔 - 74  文章 - 0  评论 - 34  阅读 - 18万

【解决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   _一级菜鸟  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2019-08-16 开发注意事项
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示