2011-11-14 30 views
0

我有一個系統,客戶想要修改當前模型,以便每次用戶進行更改時,管理員必須在寫入數據庫之前接受更改。閱讀實體預期的SQL查詢?

我正在考慮快速修復這通過覆蓋SaveChanges並在ObjectStateManager中獲取每個對象,並將其預期的sql代碼添加到一個limbo表中,這將保留inteled sql查詢直到管理員接受它(然後運行它)。

我知道你可以在數據庫查詢上使用ToTraceString(),但是你能以某種方式從ObjectStateManager中取出對象上的預期sql查詢嗎?

正想着這樣的事情:

var modified = DB.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified); 

     foreach (var mod in modified) 
     { 

      //Insert the query to the limbo table   
      tblPendingChanges change = new tblPendingChanges(); 

      //Code omitted 
      change.sql = mod.Query; 
      //Code omitted 
      DB.tblPendingChanges.AddObject(change); 

      mod.Delete(); 

     } 
DB.SaveChanges(); 
+2

如何爲每個實體添加'IsApproved'標誌....如果用戶編輯實體時將其設置爲false;並可能阻止進一步的編輯,直到管理員批准... –

+0

嗯,以及會導致一些問題,因爲用戶可以添加地址/人等等他們的個人資料是關係。並能夠首先更改名稱或電子郵件,保存,然後再點別的。 – Anders

+0

有趣的是:我沒有看到原始問題中的要求...... –

回答

0

我用實體包裝解決了這個問題,發現here

這讓我讀出每一個SQL語句,然後才發送到服務器。重定向它。

我不得不編輯包裝以允許將參數正確插入到語句中,以便可以運行sql語句。

0

你的解決方案是可怕的。如果您有要求每次更改都必須獲得批准,那麼會導致批准工作流程,您可以將更改保存到某個臨時商店,並在批准後將其移至主表格。它實際上並沒有在SQL級別上完成。如果您需要SQL級別的工作,請不要使用像Entity框架這樣的高級工具,因爲它們實際上不是爲了支持這一點而設計的。例如EF不會爲您提供生成的用於數據修改的SQL命令。

+0

然後你會推薦什麼?對於包含的數據,系統並沒有進行太多更新,但數據真的非常靈敏,因此必須由管理員檢查才能將其推送到實時表(其他系統也可以使用)。我一直在尋找ef跟蹤包裝,並獲得純文本工作的sql命令。但如果你有更好的解決方案,請詳細說明。 – Anders

+0

只要你不強迫EF「不保存數據」。要麼不使用EF,要麼重新設計應用程序以單獨存儲更改,並添加管理員批准更改的另一個管理員UI,並將其保存到主表中。 –

+0

「分開存儲更改」可以請您詳細說明嗎?假設我有一個擁有tblAdress關係的客戶。地址被修改..但是由於其實際的計費地址,系統需要管理員檢查地址是否有效。 – Anders