2011-05-10 17 views
6

¿Cómo almacenar el elemento temporal en ObjectContext sin guardar en la base de datos?Marco de entidad: almacenamiento de entidades sin guardar en la base de datos

Contexto almacenar en HttpContext, proporcionando por clase:

public static class HttpContextExtension 
{ 
    public static MyEntityDataModelContainer GetMyContext(this HttpContext httpContext) 
    { 
     if (httpContext.Items["MyEntityDataModelContainer"] == null) 
     { 
      httpContext.Items.Add("MyEntityDataModelContainer", new MyEntityDataModelContainer()); 
     } 

     return (MyEntityDataModelContainer)httpContext.Items["MyEntityDataModelContainer"]; 
    } 
} 

Hay dos páginas en blanco: 1) FirstPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // crete new item 
     MyEntity newTemporaryItem = new MyEntity { MyEntityID = Guid.NewGuid() }; 
     // attach them to Context 
     HttpContext.Current.GetMyContext().MyEntitySet.Attach(newTemporaryItem); 
     // save changes 
     HttpContext.Current.GetMyContext().SaveChanges(); 

     // get all attached to Context items 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInFirstPage = addedItems.Count(); 
    } 
} 

Así, CountInFirstPage = 1.

2) SecondPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // get added in First page items From HttpContext 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInSecondPage = addedItems.Count(); 
    } 
} 

Aquí CountInSecondPage = 0.

Dónde estoy equivocado?

Respuesta

3

¿Tengo razón en que la segunda página es una segunda solicitud?

En ese caso, tiene una nueva colección HttpContext.Items y sus valores de la última solicitud han desaparecido. Considere usar una sesión para almacenar estos valores en tal caso.

Nota al pie: El EntityContext solo se debe usar para una solicitud y se puede almacenar en la colección HttpContext.Items por ese motivo, pero nunca como valor de sesión. Almacene solo los resultados aquí como el recuento.

+0

Sí, segmentación de SecondPage desde FirstPage por enlace ... Intenta utilizar la sesión – asolovyov

+0

¡Funciona! Rehice la HttpContextExtension a través de httpContext.Session. ¡Gracias! – asolovyov

+0

Agradable. No importa :) – sra

0

Para ejecutar una consulta sobre sus nuevos datos usando EF, deberá guardar. Podría hacer una lista para luego ejecutar la consulta en contra de la lista, pero eso requerirá que mantenga la lista en algún tipo de memoria estática (estado de sesión, estado de visualización, caché) pero si la lista es grande puede crear otros problemas.

Puedes hacer todo en un TRANSACTION. Pasar la transacción hasta que confirme o deshaga. Los objetos de la entidad se guardan, pero cuando la transacción se retrotrae, cualquier cambio se deshace. Creo que la transacción persistirá a través de las devoluciones y los redireccionamientos, pero será necesario comprometerla o eliminarla para el momento en que se presente la página.

+0

¿Quisiste decir "Pasar la transacción" == pasarlo entre las páginas? Pensé que funciona solo con un EntityContext ... – asolovyov

2

Este es el enfoque incorrecto, HttpContext solo tiene un alcance de una sola solicitud HTTP, por lo que se trata de un contexto diferente en la segunda solicitud.

Pero incluso si fuera posible almacenar el contexto de la base de datos de esa manera, es decir, incluso si decidiera almacenarlo en la sesión, este no es el camino a seguir, el alcance de cada contexto debería ser una sola unidad de trabajo , no debe mantenerlo con vida durante un período prolongado de tiempo, especialmente en un entorno web.

Simplemente guarde sus elementos temporales en la Sesión directamente, y cree un nuevo contexto para cargar estos elementos cuando esté listo.

+0

-1 La sesión es una solución pobre para un objeto de Entity Framework. EF solo enumera según sea necesario para que los objetos secundarios no vayan a existir y cuando llame al método de guardar cambios para el EF fallará. – Chad

+0

Por lo que puedo decir desde arriba, la instancia de clase es solo una clase de entidad sin otras dependencias y no unida a un contexto, así como puedes guardar cualquier otra instancia de clase en la sesión, deberías poder hacer lo mismo Con este. No entiendo muy bien tu preocupación. – BrokenGlass

+0

Necesita recuperar el objeto cambiado en la consulta en la segunda página que asumiría para un enlace de datos a un control. – Chad

Cuestiones relacionadas