2013-05-22 23 views
8

Non c'è Detach(object entity) sulla DbContext in Entity Framework 5.Riportare il metodo DbContext.Detach() con un metodo di estensione (EF5)

Per staccare un ente, lo Stato ha bisogno ora di essere cambiato. Forse mi manca qualcosa, ma questo sembra molto meno intuitivo e leggibile rispetto all'uso del metodo Detach:

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

Sono tentato di basta creare un metodo di estensione per riportare il metodo Detach:

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

Qual è il motivo per cui Microsoft ha rimosso il metodo DbContext.Detach() in EF 5?

+1

"Sono tentato di creare solo un metodo di estensione" - Perché dovresti creare un metodo di estensione per una classe di cui hai il pieno controllo? Puoi aggiungerlo direttamente a 'WIMTEntities'. – hvd

risposta

16

rimozione di un metodo Detach dalla (DbContext) API ha una logica perché Detach non opera su un oggetto grafico ma stacca solo l'oggetto singolo che si passa nel metodo. Questo è diverso da tutti gli altri metodi che modificano lo stato dell'oggetto:

  • Attach attribuisce l'oggetto fornito inclusi tutti gli oggetti correlati nel grafico oggetto di proprietà di navigazione
  • Add aggiunge l'oggetto fornito inclusi tutti gli oggetti correlati al contesto
  • Remove elimina l'oggetto in dotazione compresi gli oggetti relativi che sono stati configurati con cascata eliminare

D'altra impostazione della mano stato manualmente su Modified, Added o Deleted agisce sempre solo sull'oggetto fornito, non sugli oggetti correlati. Questo vale anche per la chiamata al metodo Detach di ObjectContext. È più conseguente staccare un oggetto solo impostando lo stato su Detached in modo che sia in linea con il comportamento di altri cambiamenti di stato, poiché come l'impostazione di qualsiasi altro stato influenza solo l'oggetto fornito senza oggetti correlati.

DbContext è, tra le altre caratteristiche, progettato per semplificare il lavoro con Entity Framework. Il vecchio metodo Detach era più confuso e il suo comportamento non è quello previsto da molti sviluppatori. (Here e here sono due riferimenti a questa confusione e alle complessità coinvolte nel distacco di un oggetto.) Secondo me non era il passo sbagliato per rimuoverlo dall'API DbContext.

Bene, puoi sempre scrivere il tuo metodo di estensione come hai fatto tu o accedere al sottostante ObjectContext tramite l'adattatore se vuoi davvero avere un metodo Detach.

5

Non ho idea del perché non esiste un metodo Detach() ma la classe DbSet espone un metodo AsNoTracking() per recuperare gli oggetti che si staccano dal DbContext.

Ecco alcuni esempi di codice da 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

Notando [questa risposta] (http://stackoverflow.com/a/5600202/538763) indica che AsNoTracking potrebbe non essere equivalente a Stacca. – crokusek

Problemi correlati