none
LINQ to Entites - Update em Entidades Relacionadas RRS feed

  • Pergunta

  • Tenho a seguinte dúvida:

    Tenho uma entidade evento que possui uma categoria (outra entidade com nome e ID), e estou tendo dificuldades e fazer alterações, pois não é permitido alterar diretamente a EntityKey ou a propriedade id da categoria dentro do evento!

    Segue abaixo o código que está dando erro.

     

          using (ContextoGeral contexto = new ContextoGeral())
          {
            var ev = (from evento in contexto.Evento
                   where evento.id == oevento.id
                   join categoria in contexto.Categoria
                   on evento.Categoria.id equals categoria.id
                   select new { evento,categoria }).First();        
    
            ev.evento.data = oevento.data;
            ev.evento.descricao = oevento.descricao;
    
            ev.categoria.id = oevento.categoria.id;
            contexto.SaveChanges();
          }

    Pesquisei e não encontrei algo que mostrasse como fazer o que preciso. Agradeço desde já.

     

    Abraços.


    --
    sexta-feira, 25 de junho de 2010 00:49

Respostas

  • Hi,

    Suspeitei desde o principio, ^^

    pode ser que eu esteja enganado, mas o EF nao vai deixar voce alterar a FK mesmo nao.

    tenta burlar, deleta o registro da categoria e adiciona ele novamente com o id alterado.

    Att,


    Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br

    R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    sábado, 26 de junho de 2010 00:42
    Moderador
  • Rui,

    Eu também achei que o problema do Thales era esse (que ele estava tentando alterar um objeto de tipo anônimo), mas, como ele explicou, o problema não é esse...

    O que acontece é que ele está tentando alterar a chave (FK na verdade) de uma entidade e o EF não está deixando...

    Acredito que a sugestão do Adriel seja válida para o problema do Thales (provavelmente não é a mais elegante, mas, vai resolver a necessidade de forma satisfatória)...

    Quanto à questão de gambiarra, eu também sou contra gambiarras, detesto quando tenho que fazer alguma... Mas, temos que aceitar que às vezes não tem jeito! Gostaria muito de nunca ter que fazer gambiarra, mas, o mundo de verdade infelizmente demanda algumas (seja por falta de tempo, por falta de solução, ou o que quer que seja)... :(

    Peço só, por favor, que não extendamos as nossas discussões quanto a questão de ser gambiarra ou não, para não tumultuarmos o fórum, OK?

    Enfim... Thales, dei uma pesquisada aqui e achei esse post que pode ser útil pra você... Dê uma olhada:

    http://internationalized.spaces.live.com/blog/cns!43F3A7682D1564E4!1216.entry


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Thales Raymond sábado, 3 de julho de 2010 16:16
    domingo, 27 de junho de 2010 19:16
    Moderador

Todas as Respostas

  • Hi,

    Se nao me engano quando vc faz o select new {evento categoria} e altera essas propriedades nao adianta mandar salvar.

    Essa classe evento.Categoria referencia a mesma tabela que a classe Categoria ccerto?

    entao voce nao precisa fazer um select new { evento, categoria } pra alterar ambos. voce so precisa fazer um select evento e alterar o evento e o evento.categoria. e depois salva.

    tenta isso

    Att,


    Adriel Codeco Silva Microsoft Partner http://adrielcodeco.wordpress.com www.uppercase.com.br adrielcodeco@hotmail.com
    sexta-feira, 25 de junho de 2010 01:12
    Moderador
  • Já tentei tambem, o problema é que nos dois casos o ID é bloqueado, ou seja, não consigo altera-lo diretamente.
    --
    sexta-feira, 25 de junho de 2010 17:23
  • Prezado,

    Já tentou da seguinte forma:

    var ev = (from evento in contexto.Evento
         where evento.id == oevento.id
         join categoria in contexto.Categoria
         on evento.Categoria.id equals categoria.id
         select evento).First();
    
    ev.data = oevento.data;

    ?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 25 de junho de 2010 18:53
    Moderador
  • A dificuldade não é em atualizar os dados do evento, a idéia desse metodo é a seguinte:

    O usuario pode fazer uma alteração dentro dos dados do evento, e dentre esses dados tem a categoria, que possui um nome e um id. Caso eu não altere os dados da categoria tudo funcionada perfeitamente. O problema é atualizar os dados da categoria dentro do evento, o que o LINQ não me deixar fazer diretamente, não consigo alterar a propriedade id/nome da categoria simplesmente atribuido o valor do objeto oevento(parametro do metodo). Minha dificuldade é esse, atualizar os dados da FK da categoria que está na tabela evento.

     

    O erro que dá quando tento alterar o id da categoria dentro do evento é:

    The property 'id' is part of the object's key information and cannot be modified.


    --
    sexta-feira, 25 de junho de 2010 21:54
  • Hi,

    Suspeitei desde o principio, ^^

    pode ser que eu esteja enganado, mas o EF nao vai deixar voce alterar a FK mesmo nao.

    tenta burlar, deleta o registro da categoria e adiciona ele novamente com o id alterado.

    Att,


    Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br

    R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    sábado, 26 de junho de 2010 00:42
    Moderador
  • Se eu apagar o registro e adicionar um novo,  provavelmente vai funcionar... Mais isso é meio "errado", não? Quanto menos "truques de código" (vulgo, gambiarras) tiver no código, melhor.. haha. Mais valeu ai Adriel, não tinha pensado nessa, se ficar inviavel atualizar o registro existente vai ser na força bruta mesmo!
    --
    sábado, 26 de junho de 2010 01:35
  • Hi,

    O que seria do desenvolvedor sem as gambi ^^

    Att,


    Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br

    R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    sábado, 26 de junho de 2010 01:59
    Moderador
  • Mal aí... Tinha entendido completamente outra coisa...
    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sábado, 26 de junho de 2010 14:33
    Moderador
  • Minha explicação tambem não foi das melhores! haha.
    --
    sábado, 26 de junho de 2010 15:44
  • isso acontece pq vc ta dando um Update em um tipo anonimo, isso não existe....

    se vc ja tem um relacionamento categoria x evento, não prescisa fazer o Join...

          using (ContextoGeral contexto = new ContextoGeral())
          {
            var ev = (from evento in contexto.Evento
                   where evento.id == oevento.id
                   select evento).First();        

             ev.categoria.Load();

            ev.data = oevento.data;
            ev.descricao = oevento.descricao;         
            ev.categoria = oevento.categoria;
            contexto.SaveChanges();
          }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    sábado, 26 de junho de 2010 16:17
    Moderador
  • Hi,

    O que seria do desenvolvedor sem as gambi ^^

    Att,


    Adriel Codeco Silva
    Email: adriel.silva@uppercase.com.br
    MSN: adrielcodeco@hotmail.com
    Blog: adrielcodeco.wordpress.com
    Uppercase – www.uppercase.com.br

    R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000

     

    Adriel.... Estamos no seculo XXI... não se faz gambi....

    Se não tivesse uma forma, então contrua o metodo corretamente que faça o processo necessario... usa-se heranças, Extension Metodos, Lambda.... tem N formas de fazer algo certo, menos gambi

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    sábado, 26 de junho de 2010 16:19
    Moderador
  • Rui,

    Eu também achei que o problema do Thales era esse (que ele estava tentando alterar um objeto de tipo anônimo), mas, como ele explicou, o problema não é esse...

    O que acontece é que ele está tentando alterar a chave (FK na verdade) de uma entidade e o EF não está deixando...

    Acredito que a sugestão do Adriel seja válida para o problema do Thales (provavelmente não é a mais elegante, mas, vai resolver a necessidade de forma satisfatória)...

    Quanto à questão de gambiarra, eu também sou contra gambiarras, detesto quando tenho que fazer alguma... Mas, temos que aceitar que às vezes não tem jeito! Gostaria muito de nunca ter que fazer gambiarra, mas, o mundo de verdade infelizmente demanda algumas (seja por falta de tempo, por falta de solução, ou o que quer que seja)... :(

    Peço só, por favor, que não extendamos as nossas discussões quanto a questão de ser gambiarra ou não, para não tumultuarmos o fórum, OK?

    Enfim... Thales, dei uma pesquisada aqui e achei esse post que pode ser útil pra você... Dê uma olhada:

    http://internationalized.spaces.live.com/blog/cns!43F3A7682D1564E4!1216.entry


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Thales Raymond sábado, 3 de julho de 2010 16:16
    domingo, 27 de junho de 2010 19:16
    Moderador
  • Ok Andre, so que eu passei metade da minha arrumando a gambi dos outros... é pessoal meu... nada contra a pessoa do Adriel....

    Pelo que entendi no problema acima ele ta tentando mudar um ID que provavelmente deve ser somente leitura... eu pelo menos mantenho as minha propriedes autoincrementais assim...

    Se ele "setar" o objeto Categoria ao inves do ID da Categoria, não vejo pq não funcionar...

    Sem contar que o join nesse caso não é necessário devido ao fato da ja existir um relacionamento Evento/Categoria...


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    segunda-feira, 28 de junho de 2010 04:09
    Moderador