读实体意图sql查询?

时间:2011-11-14 08:31:00

标签: c# entity-framework

我有一个系统,客户想要重新修改当前模型,以便每次用户进行更改时,管理员必须在将更改写入数据库之前接受更改。

我想通过覆盖SaveChanges并在ObjectStateManager中获取每个对象并将其预期的sql代码添加到一个limbo表来快速修复此问题,该表将保持已保存的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 个答案:

答案 0 :(得分:0)

你的解决方案很糟糕。如果您要求必须批准每个更改,则会导致批准工作流,您可以将更改保存到某个临时存储,并在批准后将其移动到主表。它实际上没有在SQL级别上完成。如果您需要在SQL级别上工作的东西,请不要使用像Entity框架这样的高级工具,因为它们实际上并不是为了支持它而设计的。例如,EF不会为您提供为数据修改生成的SQL命令。

答案 1 :(得分:0)

我使用找到的here

实体包装器解决了这个问题

这允许我在将每个sql语句发送到服务器之前读取它。重定向它。

我必须编辑包装器以允许将参数正确插入到语句中,以便可以运行sql语句。