Pergunta

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

Foi útil?

Solução

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

Outras dicas

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top