1

我正在尝试使用 EF4(数据库优先)在上下文级别实现更改审计系统。我正在覆盖SaveChanges和捕获状态为AddedDeletedModified来自上下文的ObjectStateManager. 这通常有效,但我遇到了一个问题,即没有一个实体具有这种状态(包括我在代码中更改的实体),但上下文确实对数据库进行了更改。我已经查看Unchanged了状态为状态的条目列表,而我修改后的实体在该列表中。

我能看到的唯一复杂情况是我正在使用自我跟踪实体(因为这是一个 WCF 服务,通常将这些 STE 发送到客户端进行更改,然后客户端将修改后的 STE 备份以保持更改) . 似乎正在发生的事情是在服务器上检索并直接在那里修改(而不是传递给客户端并使用 STE ObjectChangeTracker)的对象没有被标记为Modified. 这是正常/预期的行为吗?如果是这种情况,那么显然上下文正在使用除 之外的其他ObjectStateManager内容来确定哪些更改要持久保存到数据库,因为正在进行更改。

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

4

1 回答 1

2

原来问题出在saveOptions. 由于这些选项(默认情况下)包括DetectChangesBeforeSave,因此上下文在内部调用DetectChanges,它拾取修改并正确设置ObjectStateEntry. 通过将其添加到我的审计例程中:

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

    options ^= SaveOptions.DetectChangesBeforeSave;
}

它现在可以正常工作。

于 2012-05-18T14:56:10.347 回答