Entity Framework 5 - Pourquoi est-Entité de l'État “Modifié” après PropertyValue est définie à l'Origine
- je utiliser le EF5 et ne sais pas pourquoi une entité a l'état "modifié", après j'ai mis la seule changé PropertyValue de cette entité la valeur d'origine.
using (TestDbContext context = new TestDbContext())
{
string name = context.Person.First().Name;
//count is 0
int count = context.ChangeTracker.Entries().Count(e => e.State == EntityState.Modified);
//Change Value
context.Person.First().Name = "Test";
//count is 1
count = context.ChangeTracker.Entries().Count(e => e.State == EntityState.Modified);
//Revert Value
context.Person.First().Name = name;
context.ChangeTracker.DetectChanges();
//count is 1
count = context.ChangeTracker.Entries().Count(e => e.State == EntityState.Modified);
}
Pourquoi? 🙁
OriginalL'auteur user1481065 | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Parce que Entity Framework permet de suivre si les données modifiées, pas si différent de son contenu d'origine.
Nous utilisons une chouette méthode pour réinitialiser l'état de non modifiée lorsque l'entité est inchangé:
Veuillez noter que cette méthode est pour EF 4.0, pas pour les versions plus récentes avec DbContext. Mais il n'est pas un problème pour le réécrire EF 4.1+, je l'ai fait moi-même déjà, mais je ne trouve pas le code de la droite maintenant.
changed = true;
vous pouvezbreak
de la boucle, de ne pas perdre de cycles.Bon point, je vous remercie. 🙂 Je vais l'ajouter à notre mise en œuvre.
Peu mystérieux pour le mettre en boucle. 🙂 Sur une première vue, ça me manquerait.
Oh.. vrai.. j'avais oublié que trop. Probablement encore vient de mon école, du temps où ils nous disait toujours: la Rupture est le mal!
La rupture est le mal? J'ai entendu dire que pour la première fois...
OriginalL'auteur user1793714
Merci pour l'astuce 🙂
voici mon EF5 (DbContext) Solution. J'appelle cette méthode pour chaque DbEnityEntry que je reçois de ChangeTracker.Entrées()
thx 🙂
Je crois que
entry.OriginalValues.PropertyNames.Any(propertyName => !entry.OriginalValues[propertyName].Equals(entry.CurrentValues[propertyName]))
provoquera une erreur si aucune valeur d'origine est nulle. Il devrait y avoir un test de valeur d'origine est nulle et CurrentValue n'est pas nulle pour couvrir l'exception.OriginalL'auteur user1481065
Bâtiment sur User1481065 réponse, pour surmonter la possibilité d'une exception si l'un des
OriginalValues
est null, essayez de le ci-dessous. J'ai supposé un contexte qui peut contenir plus d'une entité qui peut avoir des mises à jour (qui peut ne pas nécessairement être un véritable changement de valeur).Vous ne pouvez pas besoin de la boucle et donc le préréglage de
_dirty
.OriginalL'auteur SteveCinq