【问题标题】:How to tell if any entities in context are dirty with .Net Entity Framework 4.0如何使用 .Net Entity Framework 4.0 判断上下文中的任何实体是否脏
【发布时间】:2010-04-26 15:53:59
【问题描述】:

我希望能够判断实体框架上下文中是否有任何未保存的数据。我已经想出了如何使用 ObjectStateManager 来检查现有实体的状态,但是我有两个问题。

  1. 我更喜欢调用单个函数来查看是否有任何实体未保存,而不是循环遍历上下文中的所有实体。
  2. 我不知道如何检测我添加的实体。这表明我并不完全理解实体上下文是如何工作的。例如,如果我有 ObjectSet myContext.Employees,并且我向这个集合添加了一个新员工(使用 .AddObject),当我查看 ObjectSet 时我看不到新实体,我也看不到 .Count增加。但是,当我执行 context.SaveChanges() 时,我的新实体会被持久化......嗯?

我一直无法在我的 msdn 搜索中找到这个问题的答案,所以我希望这里的人能够为我提供线索。

提前致谢。

【问题讨论】:

    标签: entity-framework entity-framework-4


    【解决方案1】:
    var addedStateEntries = Context
        .ObjectStateManager
        .GetObjectStateEntries(EntityState.Added);
    

    【讨论】:

    • 好的,这看起来像答案。对于为什么 ObjectSet myContext.Employees 不包含我刚刚添加的实体,我仍然有点困惑。
    • 因为ObjectSets 是查询,而不是集合。
    • 好吧,我们开始误解那些 ObjectSet 应该是什么了。那么,说那些 ObjectSet 只是实体的数据库状态是否正确?如果这是真的,是否有一个集合,例如,包含内存中的所有 Employee 实体(不仅仅是数据库中的实体)?
    • 我会改写。是否有一个集合包含上下文中的所有 Employee 实体,而不是仅存在于数据库中的那些?
    • 我在stackoverflow.com/questions/2716359/…提出了一个关于该主题的新问题
    【解决方案2】:

    通过扩展方法(对于每个 ObjectContext):

    internal static class ObjectContextExtensions
    {
        public static bool IsContextDirty(this ObjectContext objectContext)
        {
            return objectContext
                .ObjectStateManager
                .GetObjectStateEntries(
                    EntityState.Added | 
                    EntityState.Deleted | 
                    EntityState.Modified).Any();
        }
    }
    

    或通过部分方法(仅适用于您的 ObjectContext):

    partial class MyModel
    {
        public bool IsContextDirty()
        {
            return ObjectStateManager
                .GetObjectStateEntries(
                    EntityState.Added | 
                    EntityState.Deleted |
                    EntityState.Modified).Any();
        }
    }
    

    【讨论】:

      【解决方案3】:

      一种获得可重用单一方法/属性的简单方法,您可以通过创建部分类并添加如下属性来向 ObjectContext 添加新方法:

      public partial class MyEntityContext
      {
        public bool IsContextDirty
        {
          get
          {
            var items = ObjectStateManager.GetObjectStateEntries(EntityState.Added);
            if(items.Any())
              return true;
            items = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted);
            if (items.Any())
              return true;
            items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
            if(items.Any())
              return true;
            return false;
          }
        }
      }
      

      根据您要查找的内容,您可以公开其他属性以了解是否只是删除或修改。此方法可以简化,但我希望清楚您需要做什么。

      【讨论】:

      • 帖子已更新。永远不要使用Count() > 0 而不是Any()Count() 遍历整个集合以获取数字,Any() 将在第一次迭代时返回 true。
      • 另外,GetObjectStateEntries 永远不应该返回 null
      【解决方案4】:

      本文准确描述了在实体框架中执行变更跟踪所需的内容:

      Identity Resolution, State Management, and Change Tracking (Entity Framework) - MSDN

      【讨论】:

      • 太棒了。不知道我是怎么错过的。谢谢。
      • 实际上,我刚刚阅读了那篇文章,并没有回答我的问题。我需要知道如果我执行 .SaveChanges 会发生什么。使用 context.AddObject 添加的新实体不会出现在上下文对象的 ObjectSet 属性中,因此我无法获取对它们的引用以检查它们的状态。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2011-06-29
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多