Question

Is there a way to find out whether there are unsaved changes in my entity context, in the Entity Framework?

Was it helpful?

Solution

This might work (if by changes you mean added, removed and modified entities):

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
                    context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
                    ) > 0;

Edit:

Improved code:

bool changesMade = context.
                   ObjectStateManager.
                   GetObjectStateEntries(EntityState.Added | 
                                         EntityState.Deleted | 
                                         EntityState.Modified
                                        ).Any();

OTHER TIPS

Starting with EF 6, there is context.ChangeTracker.HasChanges().

For those of you using EF 4+, here is an equivalent solution as an extension method:

public static class DbContextExtensions {
    public static Boolean HasPendingChanges(this DbContext context) {
        return context.ChangeTracker.Entries()
                      .Any(e => e.State == EntityState.Added
                             || e.State == EntityState.Deleted
                             || e.State == EntityState.Modified);
    }
}

Note that you can't combine the values as a bit mask. The function GetObjectStateEntries() handled the logic for you, but LINQ won't produce proper results.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top