问题: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