37

我正在尝试找到一种方法来确定对数据库上下文 (DbContext) 所做的任何更改。注意:我在 Windows 7 64 位机器上使用带有实体框架 5 的 Visual Studio 2012。

当我过去使用 ObjectContext 而不是 DbContext 时,我可以执行以下操作:

public partial class MyObjectContext
{
    public Boolean HasUnsavedChanges()
    {
        return (this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted).Any());
    }
}

现在我正在使用 DbContext,我尝试这样做:

public partial class MyDbContext
{
    public ObjectContext ObjectContext()
    {
        return (this as IObjectContextAdapter).ObjectContext;
    }

    public Boolean HasUnsavedChanges()
    {
        return (this.ObjectContext().ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted).Any());
    }
}

我遇到的问题是“HasUnsavedChanges()”方法总是返回“false”,即使我知道上下文已更改。有人对我做错了什么有任何想法吗?

4

2 回答 2

48

对于 EF 5 使用DbContext's ChangeTracker

 public bool HasUnsavedChanges()
 {
    return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
                                              || e.State == EntityState.Modified
                                              || e.State == EntityState.Deleted);
 }

对于 EF 6,使用ChangeTracker.HasChanges()也将检测多对多关系变化的方法:

 public bool HasUnsavedChanges()
 {
    return this.ChangeTracker.HasChanges();
 }
于 2012-08-17T20:25:31.640 回答
35

我知道您使用的是Entity Framework 5,这个答案对您没有帮助,但可能对其他人有所帮助。

Entity Framework 6Entity Framework Core开始,您只需通过以下代码行即可检查更改:

context.ChangeTracker.HasChanges()
于 2016-12-22T17:15:37.013 回答