Pergunta

Situação:. Objeto em sessão a partir de um contexto passado não pode ser definida como pai de outro objeto desde outro objeto está em um novo contexto

dizer que tenho um usuário na sessão que eu tinha recuperado de um contexto. Agora recarrega a página, nesse contexto tenha sido indeferido, e um novo contexto é feita.

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

Recarregar página

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

O que eu gostaria de fazer é:

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

A idéia é que, se o objeto em sessão não pertence ao contexto atual, recarregá-lo do banco de dados para que ele seja agora "propriedade" pelo mesmo contexto como todos os outros objetos no contexto atual. (Eu estou usando um contexto por solicitação)

Atualizar

Assim eu fiz esta temporariamente até que eu possa ter uma melhor idéia de como consertar isso:

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

A idéia é ver se o objeto em sessão (sessionUser) é o mesmo que o "in" do contexto. Agora, o que funciona muito bem. Primeira vez que o contexto é criado, que deve bater o banco de dados e agarrar o usuário. Uma vez que em comparação, é óbvio que eles não são os mesmos eo sesionUser é agora o usuário no contexto. Da próxima vez que, se estiver marcada, o sessionUser eo userToCheck são os mesmos.

O problema ainda é o:

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

sempre atinge o banco de dados. Esta não é uma boa solução.

Mais de atualização

Meh esta pode ser a resposta depois de tudo. Eu tinha esquecido essa regra:

x é uma propriedade do tipo ObjectQuery. Quando você executar um ObjectQuery, ele sempre irá acertar o armazenamento de backup. Isso é o que eles fazem. Se você não quer para executar uma consulta de banco de dados, em seguida, não usar um ObjectQuery.

Foi útil?

Solução

Ok conseguiu.

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

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

O método GetObjectByKey que é descrito como:

GetObjectByKey tenta recuperar um objeto que tem o especificado EntityKey do ObjectStateManager. Se o objecto actualmente não é carregado no contexto de objecto, uma consulta é executado em uma tentativa de devolver o objeto da fonte de dados.

fiz alguns testes e ele faz o que diz. A primeira vez através de (contexto foi criada a pedido) que atinge o banco de dados e verifica se objeto contra o que está em sessão. Os dois não são o mesmo assim ele define o sessionUser para o novo objeto, assim, tendo agora o sessionUser no contexto e na sessão. Da próxima vez em torno do método GetObjectByKey só verifica o contexto (Como Profiler não mostrou interacção da base de dados). Yay.

Outras dicas

Por que não verificar o ID de usuário?

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

Ou você pode simplesmente retirar o objeto de usuário a partir do contexto de idade e anexá-lo ao novo contexto usando Context.Attach ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top