it-swarm.com.de

Das Objekt kann nicht gelöscht werden, da es nicht im ObjectStateManager gefunden wurde

Ich erhalte diese 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();
    }
103
Sami

Dies bedeutet, dass die Entität nicht angehängt ist (sie wurde nicht von derselben Kontextinstanz geladen). Versuche dies:

protected MyEntities sqlEntities;

public virtual void Delete(TEntity entity)
{
    sqlEntities.Attach(entity);
    sqlEntities.DeleteObject(entity);
    sqlEntities.SaveChanges();
}
150
Ladislav Mrnka

Nur eine kleine Klarstellung zur Antwort von Ladislav Mrnka (die akzeptierte Antwort sein sollte).

Wenn Sie wie ich, haben Sie Code in einem Format wie folgt:

using (var context = new MyDataContext())
{
    context.MyTableEntity.Remove(EntytyToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

..dann das, was Sie tun wollen:

using (var context = new MyDataContext())
{
    // Note: Attatch to the entity:
    context.MyTableEntity.Attach(EntityToRemove);

    context.MyTableEntity.Remove(EntityToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

Vielleicht erscheint das offensichtlich, aber mir war zunächst nicht klar, dass es notwendig ist, die entity anzugeben, und nicht nur den context

59
Kjartan

Nur zur Erklärung von Kjartans:

Ich hatte:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = GetProject(id);
            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }

Das Problem ist, dass ich meine eigene Methode (GetProject ()) verwendet habe, um die Entität abzurufen (daher einen anderen Kontext verwendet, um die Entität zu laden):

public Project GetProject(int id)
    {
        using (var context = new Context())
        {
            var project = context.Projects
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession)))
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room)))
                .SingleOrDefault(x => x.Id == id);
            return project;      
        }
    }

Eine Lösung könnte darin bestehen, die geladene Entität wie von Kjartan angegeben anzuhängen, eine andere Lösung könnte meine Lösung sein, um die Entität in demselben Kontext zu laden:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = context.Projects.SingleOrDefault(x => x.Id == id);
            if (p == null)
                return p;

            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }
10
esbenr

Ich weiß, dass diese Frage ziemlich alt ist, aber keiner der oben genannten Punkte funktionierte für mich, da ich Register aus mehr als einer Klasse/einem Dienst löschte und jeder von ihnen seinen eigenen Datenbankverbindungskontext instanziierte.

Was ich tat, um das Problem zu lösen, war, den zuerst erstellten Kontext an die restlichen Klassen/Dienste zu senden, die auf die Datenbank zugreifen.

Zum Beispiel würde meine serviceA einige ihrer Register löschen und serviceB und serviceC aufrufen, um dasselbe mit ihren Registern zu tun.

Ich würde dann meine Register auf serviceA löschen und den mit serviceA erstellten Kontext als Parameter an serviceB und serviceC übergeben.

2
Terkhos

Sie können diesen Code schreiben:

var x=yourquery.FirstOrDefault(); 

sqlEntities.DeleteObject(x);
sqlEntities.SaveChanges();
2
mehdi

Sie sollten sicherstellen, dass Ihr Objekt in der Liste vorhanden ist, aus der Sie es entfernen möchten, und die folgende Bedingung erfüllen

if (context.entity.contains (Ihr Objekt))

entfernen Sie es.

wenn Sie eine komplizierte Bedingung für Gleichheit haben Sie sollten die gleiche Methode in der Entitätsklasse überschreiben um Ihre Bedingung für Gleichheit zu setzen, um den richtigen Weg für eine Erweiterungsmethode zu finden "entity.contains" =

Ich habe dieses Problem und löse es. Einfach Code kopieren:

sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();
0
vahid sabet

Stellen Sie sicher, dass das in Remove (Entity) übergebene Modell genau mit dem Datenbanksatz übereinstimmt. 

Manchmal ist es möglich, das Modell ohne Felder wie Id oder Date zu übergeben. Bewahren Sie diese in @ html.Hiddenfor auf, wenn Sie als Formular posten. 

Am besten ist es, 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.

0

Falls keine der oben genannten Methoden funktioniert, können Sie diese Lösung ausprobieren:

context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();

0
Ala' Alnajjar