2012-07-01 10 views
5

Suena fácil, ¿verdad? Este es el escenario ...¿Cómo actualizo una entidad en EF en múltiples solicitudes de ASP.NET sin recuperarla de nuevo?

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 

no quiero volver a mi consulta consecuencia, quiero actualizar la consulta de la carga de la página y luego guardar los cambios, ¿verdad? ¿Cómo accedo a ese objeto original para actualizarlo?

Respuesta

1

HTTP es un protocolo sin estado y, como resultado, cada solicitud que realice a su servidor necesita reconstruir su gráfico de objetos a menos que lo persista en alguna parte. Hay muchas formas de conservar datos en una "sesión" web. En ASP.NET puede almacenar datos en cookies, sesión del lado del servidor, viewstate, variables de formulario y más.

Primero se separaría de su CurrentCoral del contexto del objeto cuando haya terminado con él en Load

dbQuery.Detach(CurrentCoral) 

luego ponerlo en un almacén de datos como el estado de vista.

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

En la siguiente petición de web cuando se hace clic en el botón de guardar, recuperar la entidad del estado de vista y adjuntarlo a su nuevo contexto de objeto.

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

Perdone los errores de sintaxis. ¡VB.NET no es mi primer idioma! Para obtener más detalles sobre cómo adjuntar y separar entidades con Entity Framework, consulte el siguiente artículo.

Attaching and Detaching Objects

1

se puede poner el objeto CurrentCoral en el ViewState o período de sesiones, a continuación, recuperarlo en el evento Click.

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

Si la solicitud es una devolución de datos, el registro no se carga en Page_Load en absoluto - no hay nada que volver a la consulta ya que no han hecho una consulta en la solicitud en absoluto. Yo diría que para volver a consultar en el controlador de devolución de datos, es probable que la sobrecarga de golpear su base de datos una vez para actualizar sea mucho más pequeña que la sobrecarga de enviar toda la entidad serializada en ViewState todo el tiempo.

Cuestiones relacionadas