2013-05-22 4 views
8

Es gibt keine Detach(object entity) auf dem DbContext in Entity Framework 5.Bring back DbContext.Detach() -Methode mit einem Verlängerungsverfahren (EF5)

Um ein Objekt zu trennen, der Staat muss nun geändert werden. Vielleicht etwas bin ich dabei, aber dies scheint viel weniger intuitiv und lesbar als die Detach Methode:

context.Entry(myEntity).State = EntityState.Detached; 

ich nur eine Erweiterungsmethode versucht bin, zu schaffen die Detach Methode zurück zu bringen:

public static void Detach(this MyEntities context, object entity) 
{ 
    context.Entry(entity).State = EntityState.Detached; 
} 

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

+1

"Ich bin versucht, nur eine Erweiterungsmethode erstellen" - Warum würden Sie eine Erweiterungsmethode für eine Klasse erstellen, die Sie die volle Kontrolle über haben? Sie können es direkt zu 'WIMTENtities' hinzufügen. – hvd

Antwort

16

eine Detach Methode aus dem (DbContext) API hat eine gewisse Logik, weil Detach nicht auf einem Objektgraph arbeiten aus- aber es löst nur das einzelne Objekt, das Sie passieren in die Methode. Dies unterscheidet sich von allen anderen Methoden, die den Objektstatus ändern:

  • Attach legt das mitgelieferte Objekt einschließlich aller damit verbundenen Objekte im Objektgraphen von Navigationseigenschaften
  • Add das mitgelieferte Objekt einschließlich aller damit verbundenen Objekte auf den Kontext fügt
  • Remove löscht das gelieferte Objekt einschließlich der dazugehörigen Objekte, die mit Cascading

Auf der anderen Seite die Einstellung löschen konfiguriert wurden Zustand manuell Modified, Added oder Deleted immer wirkt nur auf dem mitgelieferten Objekt, nicht auf den verwandten Objekten. Dies ist auch der Fall für den Aufruf der Detach Methode von ObjectContext. Es ist konsequenter, ein Objekt nur zu lösen, indem der Zustand auf Detached gesetzt wird, um mit dem Verhalten anderer Zustandsänderungen in Einklang zu sein, da es wie ein anderer Zustand nur das gelieferte 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 wie viele Entwickler erwarten. (Here und here sind zwei Referenzen zu dieser Verwirrung und der in Abnehmen ein Objekt Komplexitäten.) Meiner Meinung nach war es nicht der falsche Schritt, um es von dem DbContext API zu entfernen.

Nun, können Sie immer Sie Methode besitzen Erweiterung schreiben, wie Sie den zugrunde liegenden ObjectContext über den Adapter haben oder darauf zugreifen, wenn Sie wirklich ein Detach Methode haben wollen.

5

Ich habe keine Ahnung, warum nicht es gibt Detach() Methode, aber die DbSet Klasse stellt eine Methode AsNoTracking() zu Objekten abzurufen, die von den DbContext abgelöst werden.

Hier einige Beispiel-Code von here

using (var context = new UnicornsContext()) 
{ 
    // Query for all unicorns without tracking them 
    var unicorns1 = context.Unicorns.AsNoTracking(); 

    // Query for some unitcorns without tracking them 
    var unicorns2 = context.Unicorns 
     .Where(u => u.Name.EndsWith("ky")) 
     .AsNoTracking() 
     .ToList(); 
} 
+0

Noting [diese Antwort] (http://stackoverflow.com/a/5600202/538763) zeigt an, dass AsNoTracking nicht identisch mit Trennen sein kann. – crokusek