Ich erhalte die Fehlermeldung "Das Objekt kann nicht gelöscht werden, da es nicht im ObjectStateManager gefunden wurde."
Mein Code lautet:
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);
Ich habe versucht, eine Scheinentität mit korrekt eingestellter PK zu erstellen, in der Hoffnung, dass Entity Framework DeleteObject basierend auf der PKAntworten:
Dies bedeutet, dass die Entität nicht angehängt ist (sie wurde nicht von derselben Kontextinstanz geladen). Versuche dies:
quelle
Nur eine kleine Klarstellung zur Antwort von Ladislav Mrnka (die akzeptierte Antwort sein sollte).
Wenn Sie wie ich Code in einem Format wie dem folgenden haben:
..dann das, was Sie tun möchten:
Vielleicht scheint dies offensichtlich zu sein, aber mir war anfangs nicht klar, dass es notwendig ist, die Entität anzugeben , auf die zugegriffen werden soll, und nicht nur den Kontext .
quelle
Nur um Kjartans Erklärung zu erklären:
Ich hatte:
Das Problem ist, dass ich meine eigene Methode (GetProject ()) verwendet habe, um die Entität abzurufen (und daher einen anderen Kontext zum Laden der Entität verwendet habe):
Eine Lösung könnte darin bestehen, die geladene Entität wie von Kjartan angegeben anzuhängen, eine andere könnte meine Lösung sein, um die Entität im selben Kontext zu laden:
quelle
Ich weiß, dass diese Frage ziemlich alt ist, aber keine der oben genannten Fragen hat bei mir funktioniert, da ich Register aus mehr als einer Klasse / einem Dienst gelöscht habe und jede von ihnen ihren eigenen Datenbankverbindungskontext instanziiert hat.
Was ich getan habe, um es zu lösen, war, den ersten erstellten Kontext an die übrigen Klassen / Dienste zu senden, die auf die Datenbank zugreifen wollten.
Zum Beispiel wollte ich
serviceA
einige seiner Register löschen und aufrufenserviceB
undserviceC
dasselbe mit ihren Registern tun.Ich würde dann meine Register weiter löschen
serviceA
und als Parameter den Kontext übergeben, der auf demserviceA
toserviceB
und erstellt wurdeserviceC
.quelle
Sie können diesen Code schreiben:
quelle
Falls keines der oben genannten Verfahren funktioniert hat, können Sie diese Lösung ausprobieren:
context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();
quelle
Sie sollten sicher sein, dass Ihr Objekt in der Liste vorhanden ist, aus der Sie entfernen möchten. Geben Sie die folgende Bedingung ein
Wenn Sie eine komplizierte Bedingung für die Gleichheit haben , sollten Sie die gleiche Methode in der Entitätsklasse überschreiben , um Ihre Bedingung für die Gleichheit festzulegen und den richtigen Weg für eine Erweiterungsmethode "entity.contains" zu finden.
quelle
Stellen Sie sicher, dass das an Remove (Entity) übergebene Modell genau mit dem Datenbankeintrag übereinstimmt.
Manchmal ist es möglich, das Modell ohne Felder wie ID oder Datum zu übergeben. Behalten Sie diese in @ html.Hiddenfor, wenn Sie als Formular posten.
Der beste Weg ist, die ID zu übergeben und die Entität mithilfe der Find (Id) -Methode abzurufen und diese an Remove (Entity) zu übergeben.
Hoffe das hilft jemandem.
quelle
Ich habe dieses Problem und löse es. Kopieren Sie einfach den folgenden Code:
quelle
In meinem Fall gab es einen Kontext, aber ich habe eine Entität mit der Option 'AsNoTracking' erhalten
quelle