Usuário com melhor resposta
LINQ to Entites - Update em Entidades Relacionadas

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.
--
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- Sugerido como Resposta AndreAlvesLimaModerator sábado, 26 de junho de 2010 14:33
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 2 de julho de 2010 01:51
-
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
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 25 de junho de 2010 12:25
- Não Sugerido como Resposta AndreAlvesLimaModerator sábado, 26 de junho de 2010 14:32
-
-
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 25 de junho de 2010 18:53
- Não Sugerido como Resposta AndreAlvesLimaModerator sábado, 26 de junho de 2010 14:32
-
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.
-- -
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- Sugerido como Resposta AndreAlvesLimaModerator sábado, 26 de junho de 2010 14:33
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 2 de julho de 2010 01:51
-
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!
-- -
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 -
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 -
-
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) ? -
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-000Adriel.... 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) ? -
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
-
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) ?