视图或函数[视图名称]不可更新,因为修改会影响多个基表-在POST上向任何控制器发送

时间:2018-08-30 10:02:51

标签: asp.net sql-server entity-framework asp.net-web-api2 sql-server-2017

这很奇怪:我们有一个Web API端点,该端点会定期针对提交到任何控制器的 any POST控制器方法的每个帖子定期引发此错误这些控制器调用的代码均未触及qrySoaHeader_Net

  

“视图或函数'dbo.qrySoaHeader_Net'无法更新,因为   修改会影响多个基表。“

我完全理解该消息的正常含义(您正在尝试写一个不能唯一地解析到单个表的视图),但在这种情况下绝对不是这种情况。

qrySoaHeader_Net是EF实体类(SoaHeader)用来检索报告数据的SQL Server视图。我们的任何控制器上的POST方法都没有直接接触SoaHeader,它们调用的其他对象也没有在EF中链接到它(因为它是一个视图,因此在数据库中没有任何关系)。

如果我将数据库复制回本地,则不会出现此问题,并且如果我重新启动生产IIS,则问题将消失,然后在一周左右的时间后再次出现。

在控制器上对GET方法的调用仍然可以正常工作,只是POST似乎有问题-GET方法都是仅检索数据的调用代码。

对我来说,这一定是IIS或SQL Server上“卡住”的问题吗?我已经用DBCC OPENTRAN检查了开放式翻译,但是没有。

生产服务器在Windows Server 2016 Datacenter 10.0(内部版本14393:)(管理程序)上运行Microsoft SQL Server 2017(RTM)-14.0.1000.169(X64)Express Edition(64位)。

我的机器正在Windows 10 Pro 10.0(内部版本17134:)上运行Microsoft SQL Server 2017(RTM-GDR)(KB4293803)-14.0.2002.14(X64)开发人员版(64位)

谁能想到会导致引发此错误的原因,而不管发布到哪个端点?

1 个答案:

答案 0 :(得分:1)

查看您的DI。这可能是由于DbContext实例泄漏/共享引起的。如果POST控制器获取的DbContext实例具有跟踪的,更改后的SoaHeader对象,则在调用SaveChanges时它将尝试保存它。