none
A instância de ObjectContext foi descartada e não pode mais ser usada para operações que exijam uma conexão RRS feed

  • Pergunta

  • Boa noite.

    Pessoal estou quebrando a cabeça a dois dias e não consegui encontrar uma solução para o meu problema com EF, Entidades Relacionadas e Linq. Tentarei resumir e colocar somente o necessário para evitar confusões.

    Eu tenho duas tabelas. Uma chamada COMPUTADORES e outra USUARIOS. Na tabela com COMPUTADORES tenho N campos e um deles é UsuarioID que é um FK do campo Id da tabela USUARIOS.

    Na tabela USUARIOS tenho N campos também e um deles é o campo Nome.

    O que eu preciso. Listar todos os registros que estão na tabela COMPUTADORES exibindo o campo Nome da tabela USUARIOS.

    EX.

    TABELA COMPUTADORES
    Id Marca UsuarioID
    1 Dell 2
    2 Dell 4
    3 HP  2

    TABELA USUARIOS
    Id Nome
    1 Flavio
    2 Gustavo
    3 Roberto
    4 Junior

    Exibir +- assim
    Id Marca Usuario
    1 Dell Gustavo
    2 Dell Junior
    3 HP  Gustavo

    //Linq com a instrução de consulta
    var query = from c in cxt.Computadores
                join u in cxt.Usuarios on c.UsuarioID equals u.Id
    select c;

       
    Como estou trabalhando com MVC, eu crie a view tipada com o modelo COMPUTADORES e assim fica tranquilo para exibir os dados.

    //Como faço para exibir
    @foreach(var c in Model)
    {
    	<div>c.Id</div>
    	<div>c.Marca</div>
    	<div>c.UsuarioID</div>
    }

    Até aqui funciona tranquilo. O problema é seu tento fazer assim

    @foreach(var c in Model)
    {
    	<div>c.Id</div>
    	<div>c.Marca</div>
    	<div>c.Usuarios.Nome</div>
    }

    O seguinte erro retorna "A instância de ObjectContext foi descartada e não pode mais ser usada para operações que exijam uma conexão"

    Quando eu analiso objeto pelo QuickWatch, os dados estão lá...

    O que pode ser?


    Reginaldo Villela

    quarta-feira, 9 de outubro de 2013 05:17

Todas as Respostas

  • Boa noite.

    Alguém tem alguma ideia do que pode ser?

    Grato,


    Reginaldo Villela


    sexta-feira, 11 de outubro de 2013 01:02
  • Você deve estar tentado alterar este dados do context, nao tem outro lugar que esta enviando os dados deste contexto ou o usuario altera?
    sexta-feira, 11 de outubro de 2013 01:09
  • Boa noite Daniel

    Não altero nada, eu simplesmente pego o objeto retornado em faça o laço na view como está na descrição do problema. Não adiciono ou removo registros do objetos manualmente, não faço cast e nem reordeno os registros.

    Att


    Reginaldo Villela

    sexta-feira, 11 de outubro de 2013 03:56
  • Reginaldo,

    Entenda a coisa da seguinte forma. Você chama o Action, seu Model se conecta no banco, traz os dados, passa para a VIEW que vai exibi-los. Nesse momento sua conexão com o banco de dados é "fechada" automaticamente.

    Quando a view acessa a propriedade Usuarios (c.Usuarios.Nome) tenta-se carregar do banco os dados do usuário (sim só nesse momento, leia algo sobre LazyLoad) e a conexão já era. Tá ai o porque do erro.

    Sugiro a você o seguinte: crie um Model para sua view que tenha exatamente o que você quer exibir (Id,Marca e NomeUsuario). Na sua query monte essa Model.

    var query = from c in cxt.Computadores
                join u in cxt.Usuarios on c.UsuarioID equals u.Id
    select new YourModel(){ id= c.Id, Marca = c.Marca, Nome = u.Nome};

    E retorne essa Collection de YourModel() para seu View para você exibir normalmente.

    Abraços,

    quinta-feira, 31 de outubro de 2013 13:26
  • Reginaldo,

    Entenda a coisa da seguinte forma. Você chama o Action, seu Model se conecta no banco, traz os dados, passa para a VIEW que vai exibi-los. Nesse momento sua conexão com o banco de dados é "fechada" automaticamente.

    Quando a view acessa a propriedade Usuarios (c.Usuarios.Nome) tenta-se carregar do banco os dados do usuário (sim só nesse momento, leia algo sobre LazyLoad) e a conexão já era. Tá ai o porque do erro.

    Sugiro a você o seguinte: crie um Model para sua view que tenha exatamente o que você quer exibir (Id,Marca e NomeUsuario). Na sua query monte essa Model.

    var query = from c in cxt.Computadores
                join u in cxt.Usuarios on c.UsuarioID equals u.Id
    select new YourModel(){ id= c.Id, Marca = c.Marca, Nome = u.Nome};

    E retorne essa Collection de YourModel() para seu View para você exibir normalmente.

    Abraços,

    Esqueci de comentar uma coisa... no Watch funciona porque o LazyLoad é feito enquanto a conexão não foi fechada. Quando você esta debugando, a ordem das coisas se alteram.
    quinta-feira, 31 de outubro de 2013 13:34