读取实体意图sql查询
本文关键字:查询 sql 意图 实体 读取 | 更新日期: 2023-09-27 18:14:35
我有一个系统,其中客户希望重做当前模型,以便每次用户进行更改时,管理员必须在将更改写入数据库之前接受更改。
我正在考虑通过覆盖SaveChanges并在ObjectStateManager中获取每个对象并将其预期的sql代码添加到limbo表中来做一个快速修复,该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();
你的解决方案糟透了。如果您的需求是每个更改都必须经过批准,那么它将导致审批工作流,您将更改保存到一些临时存储中,并在批准后将其移动到主表中。这实际上不是在SQL级别上完成的。如果你需要在SQL级别上工作的东西,不要使用像实体框架这样的高级工具,因为它们并不是为支持这个而设计的。例如,EF将不提供为数据修改生成的SQL命令。
我通过使用在这里找到的实体包装器解决了这个问题
这允许我在发送到服务器之前读取每个sql语句。重定向。
我必须编辑包装器,以允许将参数正确插入到语句中,以便sql语句可以运行。