Pregunta

Situación:. Objeto de sesión desde un contexto pasado no se puede establecer como padre de otro objeto desde otro objeto está en un nuevo contexto

Decir que tengo un usuario en la sesión que había recuperado de un contexto. Ahora vuelve a cargar la página, ese contexto se ha despedido, y se hizo un nuevo contexto.

someUser = context.First(user => user.id == id);
Session["SomeUser"] = someUser
...
context.Dispose();

recarga de la página

userAddress = new UserAddress();
userAddress.User = (User)Session["SomeUser"]; //BOOM NOT IN SAME CONTEXT

Lo que me gustaría hacer es:

if(!context.SomeUsers.Contains((User)Session["SomeUSer"]) //Only check context NOT DATABASE
{
   //Reload from database
   //Set user in session to new object
}

La idea es que si el objeto en sesión no pertenece al contexto actual, vuelva a cargarlo desde la base de datos por lo que ahora está "poseído" por el mismo contexto que todos los demás objetos en el contexto actual. (Estoy usando un contexto por solicitud)

Actualizar

Así que hice esta forma temporal hasta que pueda tener una mejor idea de cómo solucionar este problema:

Int32 sessionUser = sessionUser .UserID;
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
if (userCheck != sessionUser)
{
   sessionUser = userCheck;
}

La idea es ver si el objeto en sesión (sessionUser) es el mismo que el "en" el contexto. Ahora el caso de trabajos muy bien. Primera vez que se crea el contexto, que debería llegar a la base de datos y agarrar el usuario. Una vez en comparación, es obvio que no son los mismos y el sesionUser ahora es el usuario en el contexto. La próxima vez que si se comprueba, el sessionUser y la userToCheck son los mismos.

El problema sigue siendo el:

var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);

SIEMPRE golpea la base de datos. Esto no es una buena solución.

más Actualizar

Meh esto puede ser la respuesta después de todo. Me había olvidado esta regla:

  

x es una propiedad de tipo ObjectQuery.   Cuando se ejecuta una ObjectQuery, se   siempre golpear el almacén de respaldo.   Eso es lo que hacen. Si no desea   para ejecutar una consulta de base de datos, a continuación,   no utilice un ObjectQuery.

¿Fue útil?

Solución

Ok consiguió.

ChatUser userCheck = (ChatUser)EntityContext.Context.GetObjectByKey(returnValue.EntityKey);

if(userCheck != returnValue)
{
   sessionUser = userCheck;
}

El método GetObjectByKey que se describe como:

  

GetObjectByKey trata de recuperar una   objeto que tiene el especificado   EntityKey del ObjectStateManager.   Si actualmente no está cargado el objeto   en el contexto del objeto, una consulta es   ejecutado en un intento de devolver el   objeto a partir de la fuente de datos.

Hizo algunas pruebas y se hace lo que dice. La primera vez (contexto fue creado a petición) que llega a la base de datos y comprueba que objetan contra lo que está en sesión. Los dos no son lo mismo por lo que establece el sessionUser al nuevo objeto, por lo que ahora tiene la sessionUser en el contexto y en sesión. La próxima vez alrededor del método GetObjectByKey sólo comprueba el contexto (Como Profiler no mostró interacción base de datos). Yay.

Otros consejos

¿Por qué no comprobar el identificador de usuario?

context.Users.Any(user => user.Id = ((User)session["SomeUser"]).Id)

O que sólo podría desprender el objeto de usuario de la antigua contexto y adjuntarlo al nuevo contexto utilizando Context.Attach ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top