3
的TL;博士攔截並重新編寫實體框架的INSERT語句
我使用EF將項目插入一個可更新視圖,而不是一個表。 EF不能很好地處理這種情況,但如果我可以在將SQL發送到數據庫之前重新編寫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'
EF似乎這樣工作;
- 在線
01
,插入新記錄 - 在線
02
,使用scope_identity()
找出你剛插入的記錄的ID。
但是,由於我插入到視圖中,並且涉及INSTEAD OF INSERT觸發器,因此scope_identity()
最終爲NULL,而不是我的新記錄的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] = (select top(1) ItemId from [vw_Item])',N'@0 nvarchar(256)',@0=N'my item name'
因此,在線路03月底的小變化。然而,我無法找到一個方法來改變發送到服務器的INSERT語句。任何人有任何想法?
我想你可以將插入映射到存儲過程。 – dotNETbeginner