实体框架问题中的 OUTPUT 子句

OUTPUT clause in Entity Framework issues

提问人:beseus 提问时间:11/16/2023 最后编辑:Svyatoslav Danylivbeseus 更新时间:11/16/2023 访问量:69

问:

我正在尝试使用实体框架更新SQL Server分区视图中的某些数据。

我设法映射了视图(),我可以查询,选择和插入,但无法进行更新。我认为原因是实体框架生成的SQL UPDATE包含子句,但分区视图不支持它 - SQL Server抛出的错误:toTableOUTPUT 1

不能指定 OUTPUT 子句,因为目标视图“MyView”是分区视图。

有什么解决方法吗?

我尝试了使用触发器的技巧:

modelBuilder.Entity<MyView>()
        .ToTable(tb => tb.HasTrigger("SomeTrigger"));

它的工作原理是,在生成的更新 sql 查询中没有输出 1 子句,但它不是很优雅,有更好的方法吗?

EF修改后生成的SQL:

exec sp_executesql N'SET IMPLICIT_TRANSACTIONS OFF;
SET NOCOUNT ON;
UPDATE [MyView] SET [TestColumn] = @p0
WHERE [Id] = @p1 
SELECT @@ROWCOUNT;
...parameters values
C# .NET SQL-Server 实体框架核心

评论


答:

0赞 David Browne - Microsoft 11/16/2023 #1

有什么解决方法吗?

您可以改用 INSTEAD OF 触发器,而不是让 SQL Server 确定分区视图的插入。

对于 INSTEAD OF 触发器,将生成返回的结果,就好像 实际上发生了 INSERT、UPDATE 或 DELETE,即使没有 修改是触发操作的结果。

输出 - TSQL

评论

0赞 beseus 11/16/2023
我所做的是,我是这样配置的:modelBuilder.Entity<MyView>()。ToTable(“MyView”, tb => tb.HasTrigger(“IsPartitionedView”));它之所以有效,是因为在生成的更新查询中没有 OUTPUT 1 子句,但这不是很优雅。有没有更好的方法来完成同样的工作?
0赞 David Browne - Microsoft 11/16/2023
我的建议是添加一个 INSTEAD OF 触发器并删除 .HasTrigger() 配置。
0赞 beseus 11/16/2023
但是我应该在哪里添加该触发器?到数据库中的表?
0赞 David Browne - Microsoft 11/16/2023
INSTEAD OF 触发器将位于视图上。然后,您可以对基表执行适当的操作。learn.microsoft.com/en-us/sql/relational-databases/triggers/......