实体框架6中的可更新视图

时间:2019-03-22 17:56:20

标签: sql-server triggers entity-framework-6

我创建了一个视图以添加计算出的“状态”字段并重命名了基础表。
选择工作正常。
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,而我没有。

1 个答案:

答案 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");