DbContext SaveChanges () - Détection d'entités mises à jour

c# dbcontext entity-framework savechanges

Question

J'ai remplacé la méthode SaveChanges () dans la classe DbContext de Entity Framework 4.1.

Mon dérogation ressemble à ceci:

public override int SaveChanges() {

    IEnumerable<DbEntityEntry> modifiedEntityEntries = ChangeTracker.Entries().Where( e => e.State == EntityState.Modified );

    Debug.Assert( modifiedEntityEntries.Count() == 2 );

    int savedChanges = base.SaveChanges();

    Debug.Assert( savedChanges == 1 );

    // HELP! At this point, how do I tell Which of the two "Modified" entities actually updated a row in the database?

    return savedChanges;

}

Supposons qu'il y a 2 entités dans le contexte et que les deux sont marqués comme étant modifiés (EntityState.Modified). L'un d'eux a été modifié et est différent de la ligne de la base de données sous-jacente. L'autre n'est pas vraiment différent de la ligne de base de données sous-jacente, il a simplement été marqué comme tel.

Comment savoir après avoir appelé SaveChanges () laquelle des deux entités a réellement mis à jour une ligne de la base de données et laquelle n'a pas vraiment été modifiée après tout?

Réponse acceptée

C'est la façon dont nous faisons notre code. Le chargement différé et la création de proxy sont activés.

Notez que lorsque la création de proxy est activée, EF saurait quelle propriété a été modifiée, vous n'avez pas besoin d'accéder à la base de données. Le seul endroit que EF ne saurait pas savoir, c'est si un autre contexte a modifié la ligne (erreur de concurrence), afin d'éviter d'utiliser la colonne / propriété RowVersion.

Dans le constructeur:

  public DataContext()
            : base()
  {
      this.Configuration.ProxyCreationEnabled = true;
      this.Configuration.LazyLoadingEnabled = true;
      var objectContext = ((IObjectContextAdapter)this).ObjectContext;
      objectContext.SavingChanges += new EventHandler(objectContext_SavingChanges);
  }

  private void objectContext_SavingChanges(object sender, EventArgs e)
  {
      var objectContext = (ObjectContext)sender;
      var modifiedEntities =
            objectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added
            | System.Data.EntityState.Modified);

      foreach (var entry in modifiedEntities)
      {
          var entity = entry.Entity as BusinessBase;
          if (entity != null)
          {
              entity.ModDateTime = DateTime.Now;
              entity.ModUser = Thread.CurrentPrincipal.Identity.Name;
          }
      }
  }


Related

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