Bringe die DbContext.Detach () -Methode mit einer Erweiterungsmethode (EF5) zurück [duplizieren]

8

Es gibt kein Detach(object entity) auf dem DbContext in Entity Framework 5.

Um eine Entity zu lösen, muss der Status nun geändert werden. Vielleicht fehlt mir etwas, aber das scheint weniger intuitiv und lesbar zu sein als die Methode Detach :

%Vor%

Ich bin versucht, einfach eine Erweiterungsmethode zu erstellen, um die Detach-Methode zurückzubringen:

%Vor%

Aus welchem ​​Grund hat Microsoft die DbContext.Detach () -Methode in EF 5 entfernt?

    
davenewza 22.05.2013, 10:26
quelle

2 Antworten

16

Das Entfernen einer Detach -Methode aus der ( DbContext ) API hat eine gewisse Logik, weil Detach nicht auf einem Objektgraphen operiert, sondern nur das einzelne Objekt, das Sie an die Methode übergeben. Dies unterscheidet sich von allen anderen Methoden, die den Objektstatus ändern:

  • Attach hängt das bereitgestellte Objekt einschließlich aller zugehörigen Objekte im Objektdiagramm der Navigationseigenschaften
  • an
  • Add fügt das bereitgestellte Objekt einschließlich aller verwandten Objekte zum Kontext
  • hinzu
  • Remove löscht das gelieferte Objekt einschließlich der zugehörigen Objekte, die mit dem kaskadierenden Löschvorgang
  • konfiguriert wurden

Andererseits wird der Status manuell auf Modified , Added oder Deleted gesetzt. Dies wirkt sich immer nur auf das angegebene Objekt und nicht auf die zugehörigen Objekte aus. Dies ist auch der Fall, wenn Sie die Methode Detach von ObjectContext aufrufen. Es ist konsequenter, ein Objekt nur durch Festlegen des Status auf Detached zu lösen, um mit dem Verhalten anderer Statusänderungen in Einklang zu sein, da es wie jedes andere nur das bereitgestellte Objekt ohne verwandte Objekte beeinflusst.

DbContext soll unter anderem die Arbeit mit Entity Framework erleichtern. Die alte Detach -Methode war verwirrender und ihr Verhalten ist nicht so, wie viele Entwickler erwarten. ( Hier und hier sind zwei Referenzen über diese Verwirrung und die Komplexität beim Trennen eines Objekts.) Meiner Meinung nach war es nicht der falsche Schritt, sie aus der DbContext API zu entfernen.

Nun, Sie können immer Ihre eigene Erweiterungsmethode wie Sie schreiben oder auf den zugrunde liegenden ObjectContext über den Adapter zugreifen, wenn Sie wirklich eine Detach Methode haben wollen.

    
Slauma 22.05.2013, 11:53
quelle
5

Ich habe keine Ahnung, warum es keine Methode Detach() gibt, aber die Klasse DbSet macht eine Methode AsNoTracking() verfügbar, um Objekte abzurufen, die von DbContext entfernt wurden.

Hier ist ein Beispielcode von hier

%Vor%     
qujck 22.05.2013 11:24
quelle