Entity Framework 6 Evénement ObjectMaterialized et SaveChanges redéfini

c# entity-framework-6 savechanges

Question

J'utilise l'approche Model First et j'ai une classe abstraite MyEntity qui a peu de drapeaux avec l'attribut [NotMapped]. Toutes mes entités héritent de MyEntity. À l'intérieur du gestionnaire d'événements ObjectMaterialized, j'ai défini ces indicateurs pour indiquer que l'entité est matérialisée et liée à mon application.

Dans mon remplacement SaveChanges (), j'appelle base.SaveChanges (), puis réinitialise ces indicateurs. Il semble que cela entraîne la mise à jour de l'entité vers la base de données bien qu'il n'y ait pas de données réelles modifiées.

Mes questions sont:

  1. Ces indicateurs ne sont pas mappés aux colonnes de la base de données. Pourquoi les modifier a-t-il entraîné la mise à jour de l'entité vers la base de données?

  2. J'ai essayé de placer ces drapeaux dans des classes partielles au lieu de la classe abstraite héritée de chaque entité. Il semble que ces modifications d'indicateur entraînent toujours la mise à jour de l'entité dans la base de données. Pourquoi donc?

  3. J'ai également essayé de définir ces propriétés d'indicateur comme inchangées après avoir réinitialisé leurs valeurs avant base.SaveChanges (). Bien que cela ne provoque pas la mise à jour de la base de données, mon application ne se comporte pas correctement. Cette approche joue essentiellement avec l’état de l’entité ou de la propriété pour éviter de mettre à jour la base de données. Mais quel effet secondaire cela peut-il causer?

Réponse populaire

Enfin, j'ai résolu ce problème en modifiant l'état de l'entité en EntityState.Unchanged. Cela fonctionne pour mon application. Mais il reste encore une question sur la façon de changer d'état.

La manière suivante de changer l'état a causé le problème:

dbContext.Entry(entity.Entity).State = EntityState.Unchanged;

Je dois changer l'état en utilisant le code suivant:

ObjectStateEntry state = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity.Entity);
state.ChangeState(EntityState.Unchanged);


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow