2012-06-18 216 views
0

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

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

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

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

我正在通过重写SaveChanges方法来审计任何更改。正如上面所解释的,在一些较低的情况下,我可能需要保存已断开连接的已修改的实体。因此,为了进行审计,我必须从数据库中检索当前值,然后进行比较以确定断开连接时发生了什么变化。如果实体已被跟踪,则不需要获取旧值,因为我可以通过州政府经理访问它们。我没有使用自我跟踪实体,因为这对我的需求来说太过分了。

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

干杯

回答

0

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

var isTracked = ctx.ChangeTrackerEntries.Any(e => Object.ReferenceEquals(e.Entity, myEntity)) 
+0

谢谢帕维尔 - 完美的工作! – rockshire

相关问题