2017-02-07 1 views
0

J'essaie de trouver un modèle que je peux mettre en œuvre pour permettre rapidement des mises à jour partielles d'entités utilisant Entity Framework. Je peux utiliser Attach quand j'ai l'objet complet, mais si je ne fais qu'une mise à jour partielle, j'aimerais trouver un moyen de le faire de manière répétable sans spécifier les propriétés changées à chaque fois.Modèle de mise à jour d'entités partielles utilisant Entity Framework

J'ai trouvé this idea, et je l'aime vraiment, mais j'ai du mal à faire en sorte que les valeurs "OriginalValues" et "CurrentValues" soient différentes, elles correspondent toujours. Comment devrais-je récupérer des entités pour qu'une méthode de mise à jour comme celle-ci fonctionne?

Je récupère les données et les utilise pour remplir des informations sur une page (mais l'utilisateur peut changer/voir seulement une partie de l'entité), donc je ne récupère que des informations partielles sur l'entité - dois-je récupérer et détacher l'entité avant de mettre à jour comme ça? Je ne peux pas utiliser Try/UpdateModel parce que je ne fais pas ce travail dans un contrôleur. Toute idée ou modèle alternatif serait apprécié.

public virtual void Update(T entity, params Expression<Func<T, object>>[] updatedProperties) 
{ 
    //Ensure only modified fields are updated. 
    var dbEntityEntry = DbContext.Entry(entity); 
    if (updatedProperties.Any()) 
    { 
     //update explicitly mentioned properties 
     foreach (var property in updatedProperties) 
     { 
      dbEntityEntry.Property(property).IsModified = true; 
     } 
    } 
    else 
    { 
     //no items mentioned, so find out the updated entries 
     foreach (var property in dbEntityEntry.OriginalValues.PropertyNames) 
     { 
      var original = dbEntityEntry.OriginalValues.GetValue<object>(property); 
      var current = dbEntityEntry.CurrentValues.GetValue<object>(property); 
      if (original != null && !original.Equals(current)) 
       dbEntityEntry.Property(property).IsModified = true; 
     } 
    } 
} 
+0

Pourquoi ne pas utiliser jquary? – Hadee

+0

Je ne pense pas que jquery résoudra ce que j'essaie d'accomplir. Indépendamment de ce qui vient du navigateur, j'essaye de mettre à jour seulement les propriétés changées une fois que l'objet/objet partiel arrive au serveur. – Josh

Répondre

0

Il semble que cela ait pu être une question en double. J'ai trouvé une réponse here.

Pour la comparaison des propriétés mises à jour avec les valeurs de la base de données, vous devez recharger le document à partir de la base de données. Un exemple:

public ActionResult Edit(Document document, bool sendEmail, string commentsTextBox) 
    { 
     if (ModelState.IsValid) 
     { 
      var documentInDB = docsDB.Documents.Single(d => d.Id == document.Id); 

      docsDB.Entry(documentInDB).CurrentValues.SetValues(document); 

      foreach (string propertyName in docsDB.Entry(documentInDB) 
              .OriginalValues.PropertyNames) 
      { 
       var OriginalValue = docsDB.Entry(documentInDB) 
            .OriginalValues.GetValue<object>(propertyName); 
       var NewValue = docsDB.Entry(documentInDB) 
           .CurrentValues.GetValue<object>(propertyName); 

       if (!OriginalValue.Equals(NewValue)) 
       { 
        //capture the changes 
       } 
      } 
     } 
    } 

De toute évidence à mettre en œuvre dans une couche d'affaires comme je cherchais à accomplir, vous auriez à passer à la fois la version de base de données et la version mise à jour dans la méthode qui compare.

Je mettrai à jour le code une fois que j'ai testé et que j'ai un échantillon de travail.

+0

Je n'étais toujours pas vraiment capable de faire ce travail. Les valeurs actuelles/originales sont trop imprévisibles en raison de l'objet "new'd" sur la publication. – Josh