当我通过SSMS(Azure SQL DB)执行时,触发器完美地工作,但是当我通过我们的Web应用程序进行测试时,我会收到以下错误:
(0x80131904):如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'DestinationTable'不能具有任何启用的触发器。
基本上看起来我无法为使用Entity Framework的表分配触发器。
有人有任何想法如何使其正常工作吗?
提前感谢。
使用EF Core 7.X时遇到了相同的错误。
我在一个表上有一个触发器,插入时返回错误。
The target table 'MyTable' of the DML statement cannot have any enabled
triggers if the statement contains an OUTPUT clause without INTO clause
如果我去掉了触发器的逻辑,仍然会收到错误。禁用触发器解决了这个错误。但是,如果我执行手动插入操作,则在SSMS中不会返回任何错误。
对于我来说,解决方案是(让DBContext实体对象知道该表上有一个触发器)。
更新Fluent API为...
builder.Entity<MyTable>(entry =>
{
entry.ToTable("MyTable", tb => tb.HasTrigger("MyTable_Insert"));
});
关于这个主题的更多信息可以在微软网站上找到,有关EF Core 7.0 (EF7)中的重大变化,请参阅EF Core 7.0 (EF7)中的重大变化
HasTrigger
语句就足够了。它只是告诉 EF 表格有触发器,甚至触发器的名称都不重要。 - Gert Arnold我的问题类似 - 也涉及到 EF Core 7.X
中的一个重大变化,但我选择了另一种替代方案,这个方案在文档中也有提到,因为我的所有表都有触发器...
如Microsoft文档所述,在缓解措施部分,以下内容应该有所帮助:
If most or all of your tables have triggers, you can opt out of using the newer, efficient technique for all your model's tables by using the following model building convention:
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"); } } } } }
Use the convention on your DbContext by overriding ConfigureConventions:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention()); }
简而言之,我只需停止并重新启动服务,使ZEntity包意识到新添加的触发器即可。
感谢所有回答者!
这是一个比较少见的问题,但我发现自己遇到了这个错误,使用的是Microsoft.EntityFrameworkCore.SqlServer 7.0.0-preview。
当我回退到6.0.8版本时,错误消失了。
这就是开发预览版的风险所在。
INTO
从句,就不能使用OUTPUT
,而不是“您不能在Entity Framework中使用触发器”。错误告诉您问题所在;如果有一个OUTPUT
,它也需要有一个INTO
从句。 - Thom A