视图或函数[视图名称]不可更新,因为修改会影响多个基表 - 在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到任何和每个控制器的主要内容,如果未能解决你的问题,请参考以下文章

sql中如果修改了基本表的数据,视图也会自动随之修改吗?

数据库MySQL之 视图触发器存储过程函数事务数据库锁数据库备份事件

MySQL——视图触发器存储过程函数事物数据库锁数据库备份

MYSQL之视图触发器存储过程函数事物数据库锁和数据库备份

pgsql怎么改表名不影响物化视图

数据库之视图更新