2014-01-14 23 views
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似乎這樣工作;

  1. 在線01,插入新記錄
  2. 在線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語句。任何人有任何想法?

+0

我想你可以將插入映射到存儲過程。 – dotNETbeginner

回答

0

在模型上,更改Item實體的映射以使用已添加到模型中的函數(作爲存儲過程)。

然後,您可以完全控制用於插入/更新/刪除實體的sql。 一句警告:如果您更改了一個映射,則必須提供所有這些映射 - 您無法使用auto-sql進行插入的更新/刪除和功能映射。