web-dev-qa-db-fra.com

L'objet ne peut pas être supprimé car il n'a pas été trouvé dans ObjectStateManager

J'ai ce code qui fonctionne normalement:

db.myTable.DeleteObject(myCurrent);

Et j'ai eu cette erreur:

The object cannot be deleted because it was not found in the ObjectStateManager.

Les mêmes ingrédients IS dans le tableau de la base de données.

J'ai essayé ceci:

db.myTable.Attach(myCurrent);
db.myTable.DeleteObject(myCurrent);

Et j'ai une autre erreur: 

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. 

Comment régler ceci?

20
petko_stankoski

L'autre réponse n'a pas fonctionné, alors voici comment je l'ai corrigée.

Auparavant j'avais:

public void ok(myTable myCurrent)
{
    //delete entries from other tables in relationship with myTable
    db.myTables.DeleteObject(myCurrent);

}

Je l'ai corrigé avec ceci:

public void ok(int current_id)
{
    //delete entries from other tables in relationship with myTable
    var y = (from x in db.myTables where x.id == current_id select x).First();
    db.myTables.DeleteObject(y);

}
9
petko_stankoski

Le problème est que vous ne pouvez pas supprimer (ou supprimer) des entités détachées et ne pouvez pas attacher une entité deux fois. Vous avez besoin de quelque chose comme ci-dessous.

var entry = db.Entry(myCurrent);
if (entry.State == EntityState.Detached)
    db.myTable.Attach(myCurrent);
db.myTable.Remove(myCurrent);
26
Mehmet Ataş

si vous venez de recevoir un modèle de vue de modification ou de suppression par la poste ou si vous l'avez généré vous-même, EF ne le sait pas. Vous devez donc définir son statut sur "Supprimé" (ou EntityState.Modified, etc.) pour informer EF de

//generate it yourself if not posted from edit/delete view
//var model = new Model { Id = 123 };

//set to delete
db.Entry(model).State = EntityState.Deleted; // or EntityState.Modified for edit etc.
db.SaveChanges();
10
Moji

Bien que cette question soit une vieille question, elle peut aider d’autres personnes avec la même erreur, 

Dans mon cas, le problème était que je récupérais des données AsNoTracking en supprimant AsNoTracking. 

3
Beyto

Dans mon cas, j'essayais de supprimer un objet qui n'est pas extrait de la table de la base de données "Student" . Mauvaise méthode pour supprimer un objet:

var objStudent = new Student (); db.Student.Remove (objStudent);

Alors, prends soin de toi. L'objet à supprimer doit provenir de la table

1
garish

J'ai trouvé une réponse ici:

http://www.entityframeworktutorial.net/delete-entity-in-entity-framework.aspx

Voici la version "déconnectée" dont j'avais besoin;

       Student stud = null;

        using (SchoolDBContext ctx = new SchoolDBContext())
        {
            stud = (from s in ctx.Students
                    where s.StudentName == "Student1"
                        select s).FirstOrDefault();
        }

        using (SchoolDBContext newCtx = new SchoolDBContext())
        {
            newCtx.Students.Attach(stud);
            newCtx.Students.DeleteObject(stud);
            //you can use ObjectStateManager also
            //newCtx.ObjectStateManager.ChangeObjectState(stud, 
                                    System.Data.EntityState.Deleted);
            int num = newCtx.SaveChanges();
        }
1
granadaCoder

J'ai eu le même problème. Dans mon cas, j’utilisais deux instances différentes de DBContext pour la récupération de données et la mise à jour/suppression. Ensuite, j'ai utilisé la même instance pour toutes les actions de la base de données dans le même codeblock/méthode/classe, puis le problème a été résolu

0
smoothumut