视图或函数[视图名称]不可更新,因为修改会影响多个基表 - 在POST到任何和每个控制器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视图或函数[视图名称]不可更新,因为修改会影响多个基表 - 在POST到任何和每个控制器相关的知识,希望对你有一定的参考价值。
这是一个奇怪的问题:我们有一个Web API端点,定期开始为提交给任何控制器的任何POST控制器方法的每个帖子抛出此错误,即使这些控制器调用的代码都没有触及qrySoaHeader_Net
:
“视图或函数'dbo.qrySoaHeader_Net'不可更新,因为修改会影响多个基表。”
我完全理解该消息通常意味着什么(你试图写入一个不能唯一解析到一个表的视图),但这绝对不是在这种情况下发生的事情。
qrySoaHeader_Net
是EF实体类(SoaHeader
)用于检索报表数据的SQL Server视图。我们的任何控制器上的POST方法都没有直接触及SoaHeader
,并且它们调用的其他对象都没有在EF中链接到它(因为它是一个视图,所以在DB中没有关系)。
如果我在本地复制数据库,我不会遇到这个问题,如果我重新启动生产IIS,问题就会消失,然后在一周左右后重新出现。
在控制器上调用GET方法继续正常工作,它只是看起来有问题的POST - GET方法都调用只检索数据的代码。
对我而言,这表明在IIS或SQL Server上出现“卡住”的问题一定是个问题?我用DBCC OPENTRAN
检查了开放式传输但是没有。
生产服务器在Windows Server 2016 Datacenter 10.0(Build 14393:)(Hypervisor)上运行Microsoft SQL Server 2017(RTM) - 14.0.1000.169(X64)Express Edition(64位)。
我的机器在Windows 10 Pro 10.0上运行Microsoft SQL Server 2017(RTM-GDR)(KB4293803) - 14.0.2002.14(X64)Developer Edition(64位)(Build 17134 :)
任何人都可以想到,无论发布到哪个端点,都会导致抛出此错误的原因?
看看你的DI。这可能是由泄漏/共享DbContext实例引起的。如果POST控制器获取带有跟踪,更改的SoaHeader对象的DbContext实例,则在调用SaveChanges时会尝试保存它。
以上是关于视图或函数[视图名称]不可更新,因为修改会影响多个基表 - 在POST到任何和每个控制器的主要内容,如果未能解决你的问题,请参考以下文章