我创建了一个视图以添加计算出的“状态”字段并重命名了基础表。
选择工作正常。
EF是使用POCO进行的,没有EDM。
现在我需要插入/更新/删除。
失败并显示错误
更新或插入视图或函数'dbo.Clients'失败,因为它包含派生字段或常量字段。
所以我添加了ReplaceOf触发器。
从TSQL插入有效,但从EF代码插入失败并出现此错误
存储更新,插入或删除语句影响了意外的行数(0)。
探查器将其显示为最后一次查询
exec sp_executesql N'INSERT [dbo].[Clients]([PersonID], [HeadOfHousehold], [FamilyID], [Complete], {various other columns}, [ExpirationDate], [LastUpdatedDate], [Status])
VALUES (@0, @1, NULL, @2, @3, @4, @5, NULL, NULL, NULL, @6, @7, @8)
SELECT [ClientID] FROM [dbo].[Clients]
WHERE @@ROWCOUNT > 0 AND [ClientID] = scope_identity()'
,N'@0 int,@1 bit,@2 bit,@3 bit,@4 nvarchar(max) ,@5 bit,@6 datetime2(7),@7 datetime2(7),@8 int',@0=26402,@1=0,@2=0,@3=0,@4=N'',@5=0,@6='2020-03-22 00:00:00',@7='2019-03-22 00:00:00',@8=0
数据由触发器插入,但是scope_identity由于触发器而返回NULL,因此EF认为0行已更新。显然,我无法让EF使用建议的@@ IDENTITY解决方法。
如何让EF使用可更新的视图?
到目前为止,我发现的所有建议都是更新EDMX,而我没有。
答案 0 :(得分:0)
Travis Vandersypen发布了答案here。
他intercepts并在发送SQL之前对其进行了修改。
我使用的@@ IDENTITY替代品与他使用的替代品略有不同。
command.CommandText = command.CommandText.Replace("WHERE @@ROWCOUNT > 0 AND [ent_pk] = scope_identity()", "WHERE @@ROWCOUNT > 0 AND [ent_id] = @@IDENTITY");