6

Ecco lo scenario, ho un sito web, che in una singola richiesta HTTP (HTTP POST), ho bisogno di fare quanto segue:Entity Framework 4.1 - Come "forzare" EF per andare a DB invece di utilizzare Graph?

  1. afferrare un oggetto (diciamo "Tag")
  2. risparmiare un po ' altro oggetto (diciamo "Domanda")
  3. Ottenere una nuova copia di "Tag".
  4. Reindirizzare a un'altra pagina, che richiede una nuova copia di "Tag".

Dietro le quinte, 2) implica trigger di database che influiscono sui dati su "Tag".

Così quando faccio 3), EF sta tirando la stessa copia dell'oggetto dal punto 1), dal momento che è nel grafico/memoria interna (ad es stessa connessione/contesto)

ho bisogno di un "fresco" copia dell'oggetto.

In passato, ho utilizzato Detach, quindi eseguo una query EF e l'ultimo oggetto recuperato dal DB.

Ma non ho accesso all'oggetto qui per-se (ho un DTO, che viene restituito dal mio repository), quindi non ho nulla da passare al metodo Detach.

C'è un modo di dire:

var fresh = db.Tags.Find(1, ignoreGraph: true) 

O c'è un'altra alternativa?

Come accennato, sono in Entity Framework 4.1, C# 4 (e ASP.NET MVC 3)

L'unica soluzione che posso vedere in questo momento è quello di passare un parametro querystring alla pagina successiva, che poi afferra la nuova copia (dato che è un nuovo contesto, un nuovo grafico, ecc.).

+0

possibile duplicato di http://stackoverflow.com/questions/7639219/reload-object-in-an-entity -framework-content-with-updated-values ​​/ 7639578 –

+0

@nathan - possibilmente, ma la risposta non aiuterà, dato che non ho accesso all'oggetto 'umbrella' (o all'oggetto' tag' qui) per la chiamata 'context.Refresh (RefreshMode.StoreWins, umbrella)'. – RPM1984

+0

e anche, che è EF4, non EF4.1. Sembra che il metodo "Refresh" sia stato rimosso da DbContext. – RPM1984

risposta

13

trovato la mia risposta, penso:

Context.Entry<T>(entity).Reload() 

Cercando ora ...

+0

Non ho accesso a 'entity', solo' dtoEntity'. – RPM1984

+1

Se si desidera aggiornare l'entità, è necessario sapere quale entità aggiornare, no? Se conosci la chiave dell'entità, puoi ancora trovarla in Change Tracker e successivamente ricaricarla. –

+0

@Ladislav, ho un indice univoco, non l'entità. Esegui 'Find(). SingleOrDefault (x => x.UniqueUri == someUri)'. – RPM1984