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

Mik*_*tes 21 entity-framework entity-framework-4

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

  1. 我希望单个函数调用以查看是否有任何实体未保存,而不是循环上下文中的所有实体.
  2. 我无法弄清楚如何检测我添加的实体.这告诉我,我并不完全理解实体上下文是如何工作的.举例来说,如果我有对象集myContext.Employees,我添加一个新的员工来此套餐(.AddObject),我没有看到新的实体,当我看对象集,我还没有看到.Count之间增加.但是,当我执行context.SaveChanges()时,我的新实体是持久的......呵呵?

在我的msdn搜索中,我一直无法找到答案,所以我希望有人能在这里找到答案.

提前致谢.

Cra*_*ntz 15

var addedStateEntries = Context
    .ObjectStateManager
    .GetObjectStateEntries(EntityState.Added);
Run Code Online (Sandbox Code Playgroud)


Jo *_*VdB 8

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

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

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

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


Gre*_*rts 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

根据您的查找方式,您可以公开其他属性,以了解是否只删除或修改.这种方法可以简化,但我希望明确你需要做什么.

  • 发布更新.永远不要使用`Count()> 0`而不是`Any()`,`Count()`遍历整个集合来获取数字,`Any()`将在第一次迭代时返回true. (3认同)