2013-09-16 133 views
0

我想在使用實體框架時使用SQL OUTPUT clause來保存數據庫記錄的歷史記錄。爲此,EF需要爲DELETE語句生成以下示例。實體框架和SQL Server OUTPUT子句

Delete From table1 
output deleted.*, 'user name', getdate() into table1_hist 
Where field = 1234; 

表table1_hist具有相同的列表1,增加兩列來存儲誰做了操作的用戶的名稱,當它發生了。然而,EF似乎沒有辦法支持這個SQL Server的條款,所以我迷失在如何實現它。

我看着EF的源代碼,並DELETE命令是內部靜態方法(GenerateDeleteSql in System.Data.Entity.SqlServer.SqlGen.DmlSqlGenerator class)中創建的,所以我不能擴展類添加我想要的行爲。它看起來像我將不得不基於現有的代碼重寫SQL Server提供程序,但這是我想避免...

所以,我的問題是,如果有另一個選項來做到這一點(一個擴展,例如)還是我必須重寫這個提供者?

謝謝。

+1

另一種選擇是重寫'DbContext.SaveChanges'並攔截那裏的刪除。在開源項目中更改代碼總是非常棘手。您將繼續適應未來版本,因爲我認爲它不會被接受爲代碼庫中的受支持功能。 –

回答

2

你有沒有考慮任何

  • 使用存儲過程來封裝數據邏輯
  • delete觸發器捕獲數據
  • 變化數據捕捉(僅適用於企業版)
  • 其實並沒有刪除數據 - 僅僅在數據中設置一個標誌將其標記爲已刪除。
+0

感謝您的回答。我正在和Gert的評論一起分析它,爲我決定最佳方法。我會保持聯繫 – Fabio