web-dev-qa-db-fra.com

Vérifiez s'il y a des modifications en attente à enregistrer

Existe-t-il un moyen de savoir s'il y a des modifications non enregistrées dans mon contexte d'entité, dans Entity Framework?

68
Palantir

Cela pourrait fonctionner (si par des changements vous entendez des entités ajoutées, supprimées et modifiées):

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

Modifier:

Code amélioré:

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

À partir d'EF 6, il y a context.ChangeTracker.HasChanges().

84
Thaoden

Pour ceux d'entre vous qui utilisent EF 4+, voici une solution équivalente comme méthode d'extension:

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

Notez que vous ne pouvez pas combiner les valeurs en tant que masque de bits. La fonction GetObjectStateEntries() a géré la logique pour vous, mais LINQ ne produira pas de résultats appropriés.

42
Yuck