我正在尝试使用EF4(数据库优先)在上下文级别实现更改审核系统。我正在覆盖SaveChanges
并从上下文的Added
中捕获状态为Deleted
,Modified
或ObjectStateManager
的实体。这通常有效,但我遇到了一个问题,其中没有任何实体具有此状态(包括我在代码中更改的实体),但上下文 对数据库进行了更改。我已经到目前为止查看以Unchanged
为状态的条目列表,并且我的修改后的实体位于该列表中。
我能看到的唯一复杂因素是我正在使用自我跟踪实体(因为这是一个WCF服务,通常将这些STE发送到客户端进行更改,然后客户端将修改后的STE传回给持续存在变化)。 似乎正在发生的事情是在服务器上检索并直接修改的对象(而不是传递给客户端并使用STE的ObjectChangeTracker
)未标记为Modified
< / strong>即可。这是正常/预期的行为吗?如果是这种情况,那么上下文显然是使用其他而不是ObjectStateManager
来确定哪些更改会持久存储到数据库,因为更改 正在制成。
如何检测这些变化并跟踪它们?有谁知道上下文用于跟踪变化的内容是什么?我一直认为它是ObjectStateManager
,但似乎并非如此。
答案 0 :(得分:2)
原来问题在于saveOptions
。由于这些选项(默认情况下)包含DetectChangesBeforeSave
,因此上下文在内部调用DetectChanges
,从而获取修改并正确设置ObjectStateEntry
的状态。通过将此添加到我的审计例程:
if ((options & SaveOptions.DetectChangesBeforeSave) ==
SaveOptions.DetectChangesBeforeSave)
{
DetectChanges();
options ^= SaveOptions.DetectChangesBeforeSave;
}
现在可以正常使用了。