0

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

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

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

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

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

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

干杯

4

1 回答 1

2

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));
于 2012-06-18T16:52:18.473 回答