我正在使用实体框架 4.1。我已经使用许多在线示例实现了一个基本存储库。我的存储库 get 方法采用布尔参数来决定是否跟踪实体。有时,我想加载一个实体并跟踪它,有时,对于某些实体,我只想读取它们并显示它们(即在图表中)。在这种情况下,永远不需要编辑,所以我不希望跟踪它们的开销。此外,图形实体将发送到 silverlight 客户端,因此实体与上下文断开连接。因此,我的 Get 方法可以返回被跟踪或未跟踪的实体列表。这是动态创建查询实现的,如下所示:
DbQuery<E> query = Context.Set<E>();
// Track the entities in the context?
if (!trackEntities)
{
query = query.AsNoTracking();
}
但是,我现在希望使用户能够与图形交互并对其进行编辑。这种情况不会经常发生,所以我仍然想在不跟踪它们的情况下获取一些实体,但有能力保存它们。为此,我只需将它们附加到上下文并将状态设置为已修改。到目前为止,一切都在工作。
我正在通过覆盖保存更改方法来审核任何更改。如上所述,在某些低情况下,我可能需要保存断开连接的修改实体。因此,要进行审核,我必须从数据库中检索当前值,然后进行比较以找出断开连接时更改的内容。如果实体已被跟踪,则无需获取旧值,因为我可以通过状态管理器访问它们。我没有使用自我跟踪实体,因为这对我的需求来说是矫枉过正的。
问题:在我的审计方法中,我只想知道修改后的实体是否被跟踪,即我是否需要转到数据库并获取原始值?
干杯
DbContext.ChangeTracker.Entries (http://msdn.microsoft.com/en-us/library/gg679172(v=vs.103).aspx) 返回所有跟踪实体的 DbEntityEntry 对象。DbEntityEntry 具有 Entity 属性,可用于确定是否跟踪了实体。类似的东西
var isTracked = ctx.ChangeTracker.Entries().Any(e => Object.ReferenceEquals(e.Entity, myEntity));