2017-04-20 3 views
1

Ich versuche, eine Zeile aus der Datenbank usin diesen CodeAsNoTracking und entfernen

System.InvalidOperationException

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
    Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

auf Entfernen Ich habe diesen Fehler zu löschen: Das Objekt kann nicht gelöscht werden, da es nicht im ObjectStateManager gefunden.

Ich habe versucht, an der Einheit pic Bilder

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

dies der Fehler ist:

System.InvalidOperationException: Anbringen einer Einheit des Typs 'Album.DatabaseContext.ListPicture' fehlgeschlagen, weil eine andere Entität desselben Typs bereits den gleichen Primärschlüsselwert aufweist.

die Funktion GetPicture viele Male in meiner Anwendung verwendet wird, wie ich dieses Problem

+0

Wo und wie haben Sie versucht, ein Bild an Ihren EF-Kontext anzuhängen? –

+0

Ich habe den Attach-Code hinzugefügt – melom

Antwort

1

Nun lösen kann, offenbar hat das Unternehmen im Rahmen verfolgt (geladen) wird.

So verwenden entweder nicht die GetPicture Methode (ich weiß, Code-Duplizierung, aber ...):

ListPicture pic = Pictures.FirstOrDefault(x => x.pId == Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

oder wenn die Pictures ist DbSet<T> (wie es aus dem entsandten Code scheint), können Sie verwenden Sie die Find Methode statt:

ListPicture pic = Pictures.Find(Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

Beide Ansätze werden sicherstellen, dass die zurück Instanz Rahmen angebracht ist.

+0

Das, was ich dachte, wollte ich nicht Code duplizieren - danke – melom

0

Wenn Sie AsNoTracking verwenden, verwaltet EF keine Daten für Entitäten, die in den Proxy geladen wurden. Das heißt, es ist eine Entität, die nicht mehr auf EF für irgendetwas angewiesen ist.

Diese Entität ist jedoch in der Datenbank vorhanden. Beim Versuch, einen Attach auszuführen, überprüft die EF, ob bereits jemand mit derselben ID existiert und löst die Ausnahme aus.

Mein Vorschlag ist:

1: die AsNoTracking von GetPicture Methode entfernen. 2: Wenn Sie nicht, Ihre Delete-Methode wie folgt machen:

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = Pictures.Find(id); 
    if(pic != null) 
    { 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 
0

Wenn Sie nicht sicher sind, ob es angebracht wird oder nicht (und auf der Grundlage der Ausnahmen Sie bekommen es entweder oder sein könnte) Dann können Sie eine Prüfung auf der DbContext Instanz hinzufügen, um zu sehen, ob es angeschlossen ist, und es anhängen, wenn es nicht ist. Dies erfordert den Zugriff auf die Instanz DbContext, die verwendet wird.

Alternativ stellen Sie sicher, dass Sie immer eine angehängte Entität zurückgeben und nicht AsNoTracking() verwenden.

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     // add check if instance is attached 
     if(contextInstance.Entry(pic).State == System.Data.Entity.EntityState.Detached) 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); // this could be moved to inside the if block 
} 
Verwandte Themen