2012-03-17 3 views
0

Voici le code que j'ai dans mon contrôleur:EF Entité non mis à jour dans la base de données

[HttpPost] 
    public ActionResult UpdateArticle(Article article) 
    { 
     if (ModelState.IsValid) 
     { 
      article.DateAdded = 
       this.articleRepository.GetSingle(article.ID).DateAdded; 
      article.DateModified = DateTime.Now; 

      this.articleRepository.Update(article); 
       return this.Redirect("~/Admin"); 
     } 
     else 
     { 
      return this.Redirect("~/Admin/UnsuccessfulOperation"); 
     } 
    } 

Du point de vue les données proviennent mis à jour. J'ai un référentiel générique qui gère la sauvegarde. Mise à jour ressemble à ceci:

public virtual void Update(T entity) 
{ 
    //this.context.Entry(entity).State = EntityState.Modified; 

    this.context.SaveChanges(); 
} 

Si je décommenter la première ligne

Un objet avec la même clé existe déjà dans le ObjectStateManager. ObjectStateManager ne peut pas suivre plusieurs objets avec la même clé.

exception est levée. Quand il est dit que rien n'est sauvegardé.

Toute aide est appréciée.

MISE À JOUR

Ok le problème semble être que l'article mis à jour ne sont pas « partie » du contexte quand je passe à rien de mise à jour se produit. Si j'obtiens l'entité du référentiel lui-même et que je lui transmets les nouvelles valeurs, après que cette entité soit passée, tout fonctionne comme prévu. Ce morceau de code met à jour en fait la date dans le dépôt:

var art = this.articleRepository.GetSingle(article.ID); 
art.Text = article.Text; 
this.articleRepository.Update(art); 

Ce que je ne comprends pas est que cela fonctionne aussi:

var art = this.articleRepository.GetSingle(article.ID); 
art.Text = article.Text; 
this.articleRepository.Update(article); 

MISE À JOUR 2

Merci à Vitaliy I maintenant savoir que la fixation est la clé, mais quand j'essaie d'attacher la nouvelle entité, je reçois la même exception laide

Un objet avec la même clé déjà ...

MISE À JOUR 3

Comme je ne suis pas autorisé à répondre à ma propre question en moins de 8 heures, je suppose que je dois faire une autre mise à jour.

Ok, donc ce que je l'ai fait pour détacher avec succès l'ancien et joindre la nouvelle entité:

public virtual void Update(T entity, object id) 
{ 
    this.context.Entry(this.GetSingle(id)).State = EntityState.Detached; 
    this.context.Entry(entity).State = EntityState.Added; 
    this.context.Entry(entity).State = EntityState.Modified; 

    this.context.SaveChanges(); 
} 

Je penserai à une meilleure façon de passer l'ID, car il fait déjà partie de l'entité, peut-être avec et interface "myInterface" qui a la propriété ID et T sera de type "myInterface".

Merci beaucoup à Vitaliy.

+0

Il y a un code où votre entité met à jour –

Répondre

2

Vous mettez à jour l'article, qui n'est pas attaché au contexte, donc rien ne sera sauvegardé. Probablement vous l'intention était de changer DateModified alors vous devriez le faire comme ceci:

public ActionResult UpdateArticle(Guid articleID) 
    { 
     if (ModelState.IsValid) 
     { 
      var article = 
       this.articleRepository.GetSingle(articleID); 
      article.DateModified = DateTime.Now; 

      this.articleRepository.Update(article); 
       return this.Redirect("~/Admin"); 
     } 
     else 
     { 
      return this.Redirect("~/Admin/UnsuccessfulOperation"); 
     } 
    } 
+0

Salut, merci beaucoup.En fait, l'article de la vue vient aussi avec des valeurs mises à jour. Je définis les dates sur le serveur car elles ne sont pas destinées à être modifiées par les utilisateurs. Quelle sera la meilleure façon de simplement attacher l'entité en quelque sorte? Ou je dois juste copier les valeurs du paramètre article? – Unknown

+0

this.context.ArticleSet.Attach (article); this.context.Entry (article) .State = EntityState.Modified; this.context.SaveChanges(); –

+0

Un peu en avance sur vous :). Je ne suis pas capable de détacher l'ancienne entité alors quand j'essaie d'attacher la nouvelle, elle jette juste l'erreur infâme qu'un objet avec la même clé existe déjà. J'essaie de détacher l'ancienne entité par ID, comme ceci: 'this.context.Entry (this.GetSingle (id)). State = EntityState.Detached;' – Unknown

Questions connexes