Sha*_*lon 6 c# sql-server entity-framework azure-sql-database
我有一个 EF6 解决方案,我想在表上添加触发器以记录对新表的更改。这是由于我们正在对外部数据库进行集成。基本上,他们需要一份对表进行的更改日志以用于同步目的。
当我通过 SSMS(Azure SQL DB)执行时,触发器工作得很好,但是当我通过 Web 应用程序进行测试时,出现以下错误:
(0x80131904):如果 DML 语句包含 OUTPUT 子句而不包含 INTO 子句,则该语句的目标表“DestinationTable”不能具有任何启用的触发器。
基本上,我似乎无法将触发器分配给使用实体框架的表。
有人对如何实现这项工作有想法吗?
提前致谢
BDa*_*ley 13
使用 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
Run Code Online (Sandbox Code Playgroud)
如果我没有逻辑地破坏触发器,我仍然会收到错误。禁用触发器解决了该错误。但是,如果我执行手动插入,SSMS 不会返回任何错误。
对我来说,解决方案是(让 DBContext 实体对象知道触发器在表上)。
将 Fluent API 更新为...
builder.Entity<MyTable>(entry =>
{
entry.ToTable("MyTable", tb => tb.HasTrigger("MyTable_Insert"));
});
Run Code Online (Sandbox Code Playgroud)
可以在与此主题相关的 Microsoft 站点中找到更多信息EF Core 7.0 (EF7) 中的重大更改
我的问题是类似的 - 也关于突破性的变化,EF Core 7.X但我遵循了另一种路线,也出现在文档中,因为我的所有表都有触发器......
正如Microsoft 文档中所述,在缓解部分中,以下内容应该有所帮助:
如果大多数或所有表都有触发器,您可以通过使用以下模型构建约定,选择不对所有模型表使用更新、高效的技术:
Run Code Online (Sandbox Code Playgroud)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"); } } } } }通过重写 ConfigureConventions 在 DbContext 上使用约定:
Run Code Online (Sandbox Code Playgroud)protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention()); }
我发现了这个问题,它与我们正在使用的名为 ZEntity.BulkOperations.Extension 的扩展包有关。David Browne 的评论让我记录了错误,并且内部异常指向 ZEntity BulkInsert 作为错误。然后我发现了这个链接https://github.com/zzzprojects/EntityFramework-Extensions/issues/334,它指出这个包确实处理触发器。我所要做的就是使用数据库和包停止并重新启动服务,以便 ZEntity 发现新添加的触发器。
太长了;我只需停止并启动服务即可使 ZEntity 包知道添加的触发器。
感谢所有回答的人!
| 归档时间: |
|
| 查看次数: |
13665 次 |
| 最近记录: |