J'obtiens cette erreur "L'objet ne peut pas être supprimé car il n'a pas été trouvé dans l'ObjectStateManager."
Mon code est:
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
System.Type t = typeof(TEntity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
var entity = new TEntity() { PK_ID = 23 }; sqlEntities.DeleteObject(entity);
j'essayais de créer une entité fictive avec son PK correctement défini, dans l'espoir qu'Entity Framework appellerait DeleteObject basé sur le PKRéponses:
Cela signifie que l'entité n'est pas attachée (elle n'a pas été chargée par la même instance de contexte). Essaye ça:
la source
Juste une petite clarification sur la réponse de Ladislav Mrnka (qui devrait être la réponse acceptée).
Si comme moi, vous avez du code dans un format comme celui-ci:
.. puis voici ce que vous voulez faire:
Cela semble peut-être évident, mais il n'était pas clair pour moi au départ qu'il soit nécessaire de spécifier l' entité à attacher, et pas seulement le contexte .
la source
Juste pour propager l'explication des Kjartans:
J'ai eu:
Le problème est que j'ai utilisé ma propre méthode (GetProject ()) pour obtenir l'entité (donc en utilisant un autre contexte pour charger l'entité):
Une solution pourrait être d'attacher l'entité chargée comme l'indique Kjartan, une autre pourrait être la mienne solution, pour charger l'entité dans le même contexte:
la source
Je sais que cette question est assez ancienne, mais aucune des réponses ci-dessus n'a fonctionné pour moi car je supprimais des registres de plus d'une classe / service et que chacun d'eux instanciait son propre contexte de connexion à la base de données.
Ce que j'ai fait pour le résoudre a été d'envoyer le premier contexte créé au reste des classes / services qui accèdent à la base de données.
Par exemple,
serviceA
j'allais supprimer certains de ses registres et appelerserviceB
etserviceC
faire de même avec leurs registres.Je supprimerais alors mes registres sur
serviceA
et passerais en paramètre le contexte créé sur leserviceA
toserviceB
etserviceC
.la source
Vous pouvez écrire ce code:
la source
Si aucune des solutions ci-dessus ne fonctionne, vous pouvez essayer cette solution:
context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();
la source
Vous devez être sûr que votre objet existe dans la liste que vous essayez de supprimer, vous devez mettre la condition suivante
si vous avez une condition d'égalité compliquée, vous devez remplacer la méthode equal dans la classe d'entité pour mettre votre condition d'égalité, pour obtenir le bon chemin pour une méthode d'extension "entity.contains"
la source
Assurez-vous que le modèle passant dans Remove (Entity) est exactement le même que l'enregistrement de la base de données.
Parfois, il est possible de transmettre le modèle sans certains champs comme Id ou Date. conservez-les dans @ html.Hiddenfor si vous publiez sous forme de formulaire.
Le meilleur moyen est de transmettre l'ID et d'obtenir l'entité à l'aide de la méthode Find (Id) et de la transmettre à Remove (Entity)
J'espère que cela aide quelqu'un.
la source
J'ai ce problème et je le résous. Copiez simplement le code ci-dessous:
la source
Dans mon cas, il y avait un contexte, mais j'ai obtenu une entité avec l'option 'AsNoTracking'
la source