Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 截取并重写实体框架INSERT语句_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 截取并重写实体框架INSERT语句

C# 截取并重写实体框架INSERT语句,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,tl;dr 我使用EF将项目插入到可更新的视图中,而不是表中。EF不能很好地处理这种情况,但如果我能在SQL发送到数据库之前重新编写它,这是一个简单的修复方法。有人知道我可以在哪里注入重写代码吗 深入 我有一个名为[VW_Item]的视图,而不是一个名为[Item]的表 当我尝试插入时,实体框架生成如下SQL 01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0) 02 SELECT [ItemId] FROM

tl;dr

我使用EF将项目插入到可更新的视图中,而不是表中。EF不能很好地处理这种情况,但如果我能在SQL发送到数据库之前重新编写它,这是一个简单的修复方法。有人知道我可以在哪里注入重写代码吗

深入

我有一个名为
[VW_Item]
的视图,而不是一个名为
[Item]
的表

当我尝试插入时,实体框架生成如下SQL

01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
02 SELECT [ItemId] FROM [dbo].[vw_Item]
03 WHERE @@ROWCOUNT > 0 AND [ItemId] = scope_identity()',N'@0 nvarchar(256)',@0=N'my item name'
01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
02 SELECT [ItemId] FROM [dbo].[vw_Item]
03 WHERE @@ROWCOUNT > 0 AND [ItemId] = (select top(1) ItemId from [vw_Item])',N'@0 nvarchar(256)',@0=N'my item name'
EF似乎是这样工作的

01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
02 SELECT [ItemId] FROM [dbo].[vw_Item]
03 WHERE @@ROWCOUNT > 0 AND [ItemId] = scope_identity()',N'@0 nvarchar(256)',@0=N'my item name'
01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
02 SELECT [ItemId] FROM [dbo].[vw_Item]
03 WHERE @@ROWCOUNT > 0 AND [ItemId] = (select top(1) ItemId from [vw_Item])',N'@0 nvarchar(256)',@0=N'my item name'
  • 在第
    01行
    ,插入新记录
  • 在第
    02行
    中,使用
    scope\u identity()
    计算您刚才插入的记录的ID
  • 但是,由于我要插入到视图中,并且涉及到一个INSTEAD OF INSERT触发器,
    scope\u identity()
    最终为空,而不是我的新记录的ID。EF感到困惑,认为插入失败

    我可以很容易地像这样重写代码

    01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
    02 SELECT [ItemId] FROM [dbo].[vw_Item]
    03 WHERE @@ROWCOUNT > 0 AND [ItemId] = scope_identity()',N'@0 nvarchar(256)',@0=N'my item name'
    
    01 exec sp_executesql N'INSERT [dbo].[vw_Item]([ItemName]) VALUES (@0)
    02 SELECT [ItemId] FROM [dbo].[vw_Item]
    03 WHERE @@ROWCOUNT > 0 AND [ItemId] = (select top(1) ItemId from [vw_Item])',N'@0 nvarchar(256)',@0=N'my item name'
    

    所以在第03行的末尾有一个小的变化。但是,我找不到一种方法来更改发送到服务器的INSERT语句。有人有什么想法吗?

    关于您的模型,请更改项目实体的映射,以使用您添加到模型中的函数(作为存储过程)

    然后,您可以完全控制用于插入/更新/删除实体的sql。
    警告:如果您更改了一个映射,您必须提供所有映射—您不能使用用于更新/删除的自动sql和用于插入的函数映射。

    我认为您可以将插入映射到存储过程。。