C# 截取并重写实体框架INSERT语句
tl;dr 我使用EF将项目插入到可更新的视图中,而不是表中。EF不能很好地处理这种情况,但如果我能在SQL发送到数据库之前重新编写它,这是一个简单的修复方法。有人知道我可以在哪里注入重写代码吗 深入 我有一个名为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
[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()
计算您刚才插入的记录的IDscope\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和用于插入的函数映射。我认为您可以将插入映射到存储过程。。