52 votes

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

J'ai code suivant pour ajouter ou mettre à jour l'objet d'Entité. trouver l'objet en clé primaire, en fonction de la réponse je suis de l'ajout ou de la mise à jour de l'objet.

Ajout d'enregistrement des œuvres, mais en cours de mise à jour de sa présentation ce message d'erreur "Un objet avec la même clé existe déjà dans le Vousmanager. Le Vousmanager ne peut suivre plusieurs objets avec la même clé"

Dans mon MSSQL base de données, j'ai qu'un seul enregistrement.

var v = db.Envelopes.Find(model.ReportDate, model.Service);
if (v == null)
{
    db.Envelopes.Add(model);
    db.SaveChanges();
    ViewBag.status = "Record Add successfully";
    ModelState.Clear();
}
else
{
    db.Entry(model).State = EntityState.Modified;
    db.SaveChanges();
}

Comment puis-je résoudre ce message d'erreur?

88voto

Ladislav Mrnka Points 218632

Comme mentionné par @anon vous ne pouvez pas joindre de modèle, une fois que vous avez chargé de l'entité avec la même clé. Les modifications doivent être appliquées à l'attaché de l'entité. Au lieu de cela:

db.Entry(model).State = EntityState.Modified;

utilisez ceci:

db.Entry(v).CurrentValues.SetValues(model);

9voto

tdykstra Points 2585

Si une requête de lecture de l'entité à être mis à jour et c'est pourquoi vous obtenez le message d'erreur, vous pouvez modifier cette requête à AsNoTracking. Voir la AsNoTracking exemple dans: http://www.asp.net/entity-framework/tutorials/advanced-entity-framework-scenarios-for-an-mvc-web-application

7voto

anon Points 3824

Je suppose que vous dire que votre erreur se produit ici:

db.Entry(model).State = EntityState.Modified;

Une fois que vous exécutez Find(), votre Enveloppe est déjà suivi par votre contexte. Cela signifie que si vous avez besoin de changer une propriété, il suffit de changer sur v, et ensuite appeler SaveChanges(). Ne vous inquiétez pas sur la définition de l'état Modifié.

5voto

David Swindells Points 258

Si vous définissez votre contexte de AsNoTracking() ce qui va arrêter aspmvc le suivi de l'évolution de l'entité dans la mémoire (qui est ce que vous voulez de toute façon sur le web). N'oubliez pas de l'instruction à l'aide.

using System.Data.Entity;

db.Envelopes.AsNoTracking().Find(model.ReportDate, model.Service);

J'ai obtenu ce à partir de ce post sur le forum -> http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application

3voto

Maslow Points 7268

Je suis en utilisant ce parce que j'ai déjà créé une nouvelle instance, et rempli les propriétés j'ai besoin de mettre à jour.

var key=this.CreateEntityKey("Envelopes",model); 
        ObjectStateEntry ose;
        if(this.ObjectStateManager.TryGetObjectStateEntry(key, out ose)){
            var entity=(Page)ose.Entity;
            Envelopes.Detach(entity);
        }
            this.Envelopes.Attach(model);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X