EF4 ObjectStateManager不报告更改?

时间:2012-05-18 14:15:14

标签: entity-framework entity-framework-4 self-tracking-entities objectstatemanager

我正在尝试使用EF4(数据库优先)在上下文级别实现更改审核系统。我正在覆盖SaveChanges并从上下文的Added中捕获状态为DeletedModifiedObjectStateManager的实体。这通常有效,但我遇到了一个问题,其中没有任何实体具有此状态(包括我在代码中更改的实体),但上下文 对数据库进行了更改。我已经到目前为止查看以Unchanged为状态的条目列表,并且我的修改后的实体位于该列表中。

我能看到的唯一复杂因素是我正在使用自我跟踪实体(因为这是一个WCF服务,通常将这些STE发送到客户端进行更改,然后客户端将修改后的STE传回给持续存在变化)。 似乎正在发生的事情是在服务器上检索并直接修改的对象(而不是传递给客户端并使用STE的ObjectChangeTracker)未标记为Modified < / strong>即可。这是正常/预期的行为吗?如果是这种情况,那么上下文显然是使用其他而不是ObjectStateManager来确定哪些更改会持久存储到数据库,因为更改 正在制成。

如何检测这些变化并跟踪它们?有谁知道上下文用于跟踪变化的内容是什么?我一直认为它是ObjectStateManager,但似乎并非如此。

1 个答案:

答案 0 :(得分:2)

原来问题在于saveOptions。由于这些选项(默认情况下)包含DetectChangesBeforeSave,因此上下文在内部调用DetectChanges,从而获取修改并正确设置ObjectStateEntry的状态。通过将此添加到我的审计例程:

if ((options & SaveOptions.DetectChangesBeforeSave) == 
               SaveOptions.DetectChangesBeforeSave)
{
    DetectChanges();

    options ^= SaveOptions.DetectChangesBeforeSave;
}

现在可以正常使用了。