2012-07-01 4 views
5

Sembra facile, vero? Ecco lo scenario ...Come aggiornare un'entità in EF su più richieste ASP.NET senza recuperarlo di nuovo?

Private dbQuery As New ReefEntities 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     CurrentCoral = (From c In dbQuery.Corals Where c.CoralID = intCoralID).FirstOrDefault 
     txtCommonName.Text = CurrentCoral.CommonName 
    End If 
End Sub 

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click 
    'how do I access the coral from the page load to update it? 
    CurrentCoral.CommonName = strName 
    dbQuery.SaveChanges() 
End Sub 

Non voglio ri-query mio risultato, voglio aggiornare la query dal caricamento della pagina e quindi salvare le modifiche, giusto? Come posso accedere a quell'oggetto originale per aggiornarlo?

risposta

1

HTTP è un protocollo stateless e, di conseguenza, ogni richiesta effettuata sul server deve ricostruire il grafico dell'oggetto a meno che non lo si mantenga da qualche parte. Esistono molti modi per mantenere i dati su una "sessione" web. In ASP.NET è possibile memorizzare i dati in cookie, sessione lato server, viewstate, variabili modulo e altro.

In primo luogo si dovrebbe scollegare il CurrentCoral dal contesto oggetto quando hai finito con esso in Page_Load

dbQuery.Detach(CurrentCoral) 

poi metterlo in un archivio dati, come stato di visualizzazione.

Me.ViewState.Add("CurrentCoral", CurrentCoral) 

Nella prossima richiesta Web quando il pulsante di salvataggio viene cliccato, recuperare l'entità dalla stato di visualizzazione e allegarlo al nuovo contesto di oggetto.

CurrentCoral = CType(Me.ViewState("CurrentCoral"), Coral) 
dbQuery.Attach(CurrentCoral) 
CurrentCoral.CommonName = strName 
dbQuery.SaveChanges() 

Si prega di perdonare eventuali errori di sintassi. VB.NET non è la mia prima lingua! Per ulteriori dettagli su come allegare e scollegare entità con Entity Framework, consultare il seguente articolo.

Attaching and Detaching Objects

1

si potrebbe mettere il vostro oggetto CurrentCoral nel ViewState o sessione, poi recuperarlo nell'evento Click.

Dim oCurrentCorral as Object = ViewState("CurrentCoral") 
dbQuery.ObjectStateManager.ChangeObjectState(oCurrentCoral, System.Data.EntityState.Added) 
dbQuery.SaveChanges() 
0

Se la richiesta è un postback, il record non viene caricato in Page_Load a tutti - non c'è niente da ri-query poiché non l'ha fatta una query nella richiesta a tutti. Direi di interrogare nuovamente nel gestore postback, è probabile che il sovraccarico di colpire il tuo database una volta per l'aggiornamento sia molto più piccolo del sovraccarico di inviare l'intera entità serializzata in ViewState per tutto il tempo.

Problemi correlati