是否可以判断是否跟踪了某个实体?

时间:2012-06-18 16:33:10

标签: entity-framework

我正在使用Entity Framework 4.1。我已经使用大量在线示例实现了一个基础存储库。我的存储库获取方法采用bool参数来决定是否跟踪实体。有时,我想加载一个实体并跟踪它,其他时候,对于某些实体,我只想读取它们并显示它们(即在图形中)。在这种情况下,永远不需要编辑,所以我不希望跟踪它们的开销。此外,图形实体被发送到silverlight客户端,因此实体与上下文断开连接。因此,我的Get方法可以返回跟踪或不跟踪的实体列表。这是通过以下方式动态创建查询来实现的:

DbQuery<E> query = Context.Set<E>();

 // Track the entities in the context?
 if (!trackEntities)
 {
    query = query.AsNoTracking();
 }

但是,我现在想要让用户与图表进行交互并进行编辑。这种情况不会经常发生,因此我仍然希望获得一些实体而不跟踪它们但能够保存它们。为此,我只需将它们附加到上下文并将状态设置为已修改。到目前为止一切正常。

我通过覆盖SaveChanges方法来审核任何更改。如上所述,在某些情况下,我可能需要保存已断开连接的已修改实体。因此,要进行审计,我必须从数据库中检索当前值,然后进行比较以确定断开连接时更改的内容。如果已跟踪实体,则无需获取旧值,因为我可以通过状态管理器访问它们。我没有使用自我跟踪实体,因为这对我的要求来说太过分了。

问题:在我的审核方法中,我只是想知道是否跟踪了修改后的实体,即我是否需要转到数据库并获取原始值?

干杯

1 个答案:

答案 0 :(得分:0)

DbContext.ChangeTracker.Entries(http://msdn.microsoft.com/en-us/library/gg679172(v=vs.103).aspx)返回所有被跟踪实体的DbEntityEntry对象。 DbEntityEntry具有Entity属性,您可以使用该属性来确定是否跟踪实体。像

这样的东西
var isTracked = ctx.ChangeTrackerEntries.Any(e => Object.ReferenceEquals(e.Entity, myEntity))