Coldairarrow / EFCore.Sharding

Database Sharding For EFCore
Apache License 2.0
693 stars 143 forks source link

.Net8版本,某些场景无法插入和更新,错误信息:如果 DML 语句包含不带 INTO 子句的 OUTPUT 子句,则该语句的目标表 'sal_order1' 不能具有任何启用的触发器 #148

Open fanxinshun opened 1 month ago

fanxinshun commented 1 month ago

导致该错误的官方说明及解决方法都有说明文档:https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-7.0/breaking-changes?tabs=v7#sqlserver-tables-with-triggers 在我的sql server数据库中,每张表都有触发器,InsertAsync和UpdateAsync方法能否支持不返回int,并且在生成的sql中去除OUTPUT 或者有其它什么解决方案

fanxinshun commented 1 month ago

有一千多张表,所有表都有触发器,则可以使用以下模型生成约定,选择不再对所有模型表使用较新的高效技术:

public class BlankTriggerAddingConvention : IModelFinalizingConvention { public virtual void ProcessModelFinalizing( IConventionModelBuilder modelBuilder, IConventionContext 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");
            }
        }
    }
}

}这种解决办法比较适合,不知能能否采用