2011-11-14 29 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