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.
Il y a un code où votre entité met à jour –