如何判断上下文中的任何实体是否与.Net Entity Framework 4.0相关

时间:2010-04-26 15:53:59

标签: entity-framework entity-framework-4

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

  1. 我希望调用一个函数来查看是否有任何实体未保存,而不是循环上下文中的所有实体。
  2. 我无法弄清楚如何检测我添加的实体。这告诉我,我并不完全理解实体上下文是如何工作的。例如,如果我有ObjectSet myContext.Employees,并且我将新员工添加到此集合(使用.AddObject),当我查看ObjectSet时我看不到新实体,而且我也看不到.Count增加。但是,当我执行context.SaveChanges()时,我的新实体是持久的......呵呵?
  3. 我在msdn搜索中无法找到答案,所以我希望有人能在这里找到答案。

    提前致谢。

4 个答案:

答案 0 :(得分:15)

var addedStateEntries = Context
    .ObjectStateManager
    .GetObjectStateEntries(EntityState.Added);

答案 1 :(得分:8)

通过扩展方法(对于每个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();
    }
}

答案 2 :(得分:6)

获取可重用单个方法/属性的简单方法是,您可以通过创建分部类并添加如下属性来向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;
    }
  }
}

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

答案 3 :(得分:3)

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

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