HydroPowerDeveloper
HydroPowerDeveloper

Reputation: 3497

Entity Framework 5 - DbContext Has Changes?

I'm trying to find a way to determine of any changes have been made to a database context (DbContext). Note: I'm using Visual Studio 2012 with Entity Framework 5 on a Windows 7, 64-bit box.

Back when I used to use ObjectContext instead of DbContext, I could do something like:

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

Now that I'm using DbContext, I tried to do this:

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());
    }
}

The problem that I'm having is that the method "HasUnsavedChanges()" always return "false" even when I know for a fact that the context has been changed. Does anyone have any ideas as to what I'm doing wrong?

Upvotes: 44

Views: 38290

Answers (2)

Mark Oreta
Mark Oreta

Reputation: 10416

For EF 5 use DbContext's ChangeTracker:

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

For EF 6 use the ChangeTracker.HasChanges() method which will also detect changes in many to many relationships:

 public bool HasUnsavedChanges()
 {
    return this.ChangeTracker.HasChanges();
 }

Upvotes: 56

Emdadul Sawon
Emdadul Sawon

Reputation: 6077

I know as you are using Entity Framework 5, this answer will not help you, but it may help others.

Starting with Entity Framework 6 and in Entity Framework Core you can check for changes simply by following line of code:

context.ChangeTracker.HasChanges()

Upvotes: 37

Related Questions