【问题标题】:Is it possible to tell if an entity is tracked?是否可以判断一个实体是否被跟踪?
【发布时间】:2021-10-13 23:07:31
【问题描述】:

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

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

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

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

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

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

干杯

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    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));
    

    【讨论】:

    • 似乎无法编辑您的答案,因为它没有足够的字符。首先,感谢您让我朝着正确的方向前进!不过这些天应该是var isTracked = ctx.ChangeTracker.Entries().Any(e =&gt; Object.ReferenceEquals(e.Entity, myEntity))
    • 根据您的评论更新,
    猜你喜欢
    • 2011-01-31
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多