实体框架5 - DbContext有变化吗?

Hyd*_*per 32 entity-framework entity-framework-4.1

我正在尝试找到一种方法来确定对数据库上下文(DbContext)所做的任何更改.注意:我在Windows 7,64位框中使用Visual Studio 2012和Entity Framework 5.

当我以前使用ObjectContext而不是DbContext时,我可以做类似的事情:

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

既然我正在使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是方法"HasUnsavedChanges()"总是返回"false",即使我知道上下文已被更改的事实.有没有人对我做错了什么有任何想法?

Mar*_*eta 43

你应该用DbContext's ChangeTracker:

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

  • 有没有办法做到这不是O(N)? (4认同)

Emd*_*won 32

我知道当你使用Entity Framework 5时,这个答案对你没有帮助.但它可能会帮助别人.

从Entity Framework 6开始,您只需按照以下代码行检查更改:

context.ChangeTracker.HasChanges()
Run Code Online (Sandbox Code Playgroud)