提问人:beseus 提问时间:11/16/2023 最后编辑:Svyatoslav Danylivbeseus 更新时间:11/16/2023 访问量:69
实体框架问题中的 OUTPUT 子句
OUTPUT clause in Entity Framework issues
问:
我正在尝试使用实体框架更新SQL Server分区视图中的某些数据。
我设法映射了视图(),我可以查询,选择和插入,但无法进行更新。我认为原因是实体框架生成的SQL UPDATE包含子句,但分区视图不支持它 - SQL Server抛出的错误:toTable
OUTPUT 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
答:
0赞
David Browne - Microsoft
11/16/2023
#1
有什么解决方法吗?
您可以改用 INSTEAD OF 触发器,而不是让 SQL Server 确定分区视图的插入。
对于 INSTEAD OF 触发器,将生成返回的结果,就好像 实际上发生了 INSERT、UPDATE 或 DELETE,即使没有 修改是触发操作的结果。
评论
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/......
评论