Inquiridor
CRUD com relacionamento Many to Many

Pergunta
-
Olá pessoal estou com algumas duvidas em relação ao CRUD de objetos many to many, por exemplo tenho uma tabela produto, uma tabela TipoProduto e uma terceira tabela de associação produtosTipo, como faço para realizar um update ou insert nessa tabela produtosTipo, pois toda vez que tento inserir gera alguns erro do tipo "The EntityKey property can only be set when the current value of the property is null.", ou as vezes ele tenta gravar na tabela produto e gera um erro de violação de chave.
A minha necessidade é somente fazer um insert ou update na tabela de associação produtosTipo.
Obrigado
Todas as Respostas
-
Existem vários cenários para o tipo de estrutura que está usando (Linq, Sql), supondo que você tem a PK da tabela PRODUTO e a PK da tabela TIPO, você iria inserir nas respectivas chaves estrangeiras da tabela TIPOPRODUTO o código PK.
Instancie a entidade da tabela TIPOPRODUTO e passe para as respectivas FKs o código e grave, se mesmo assim continua dando erro depure o programa para ver se realmente está passando as informações para sua entidade.
TipoProduto tipo = new TipoProduto() tipo.CodigoProduto= 1, tipo.CodigoTipo = 1, db.TipoProduto.InsertOnSubmit(tipo);
Se continuar o erro faça um simples teste coloque as colunas da tabela TIPOPRODUTO aceitando NULL e execute sua inserção, se der erro mais inseriu a informação no banco existe problema na passagem dos parâmetros e não na operação de insert.
- Editado Jefté Goes quarta-feira, 15 de janeiro de 2014 15:05
-
Obrigado pela resposta, porém o problema é que não consigo instanciar a tabela produtosTipo pois o EF não mapeia as tabelas de associação.
- Editado Luiz Augusto Gonçalves Ferreira quarta-feira, 15 de janeiro de 2014 15:48
-
Estranho, você está importando as tabelas de um sgbd?
Se sim, se tiver 3 ou mais tabelas independente da modelagem feita 1 .. 1 , N .. N todas as tabelas serão importadas.
Se não, se está criando o modelo dentro do projeto verifique a propriedade Access das tabelas, veja se está Public
- Editado Jefté Goes quarta-feira, 15 de janeiro de 2014 17:41
-
Estou importando as tabelas do SQL Server 2012, porém em vários artigos eles falam que essas tabelas de associação (ou seja que contenha somente PK) não irão aparecer e que o Insert/Update/Delete é feito implicitamente nessa tabela, so que no meu caso aqui não da certo.
Pelo que eu consegui entender toda vez que eu gravar na tabela tbProduto ele verifica se existe um tbTipoPesagem vinculado a objeto tbProdutos se existir o EF por si so já faz a inserção nessa tabela, porém no meu caso ele gera um erro toda vez que vai gravar.
uto atual se existir ele grava na tabela
-
Luiz,
Pelo seu diagrama acho que entendi o que está acontecendo, você não tem uma PK na tabela de associação para controlar as inserções com isso o EF fica "meio que perdido", não sabe exatamente que linha você está trabalhando, em todas as minhas tabelas de "associação" eu incluo uma PK até mesmo para um controle meu veja como eu faço:
- Meu EDM
- Meu código
Minha tabela de associação TipoProduto com 2 FKs respectivas as minhas tabelas Produto e Tipo e uma chave PK para meu controle , o VS importou corretamente as tabelas inclusive criou a tabela de associação que posso acessar em qualquer parte do meu código respeitando a propriedade Access.
-
-
A questão não é o banco o EF nasceu para ser a abstração no banco através de um modelo de entidades, na minha opinião a partir do momento que você escolhe trabalhar com EF você deseja abstrair o banco, fazendo com que ele seja apenas um repositório de dados, sua regra de negócio está na aplicação.
Nos teste que fiz o EF trabalha dessa forma:
Tipos:
Perecíveis - 1
Não perecíveis - 2
Produtos:
Abacaxi - 1
Feijão - 2
Arroz - 3
Tabela de Associação
Produto Tipo
1 1
2 2
3 2Supondo que não as chaves estrangeiras não seja uma PK composta, se você inserir novamente
Produto Tipo
1 1Vai existir 2 linhas iguais dentro da tabela, o EF não sabe exatamente qual você quer editar ou excluir por isso a necessidade da PK.
Produto Tipo
1 1 o id é 1?e
1 1 o id é 2?
Quando comecei a desenvolver minhas aplicações utilizando EF me deparei com essa necessidade, eu não saberia lhe dizer qual é a solução para seu cenário a forma como te passei resolve seu problema.
Em relação a ter ou não uma chave primária em uma tabela de associação acredito que com uma chave PK o desempenho seja melhor do que chave composta, trabalho com um sistema legado e acredite chave composta chega um momento que engessa.
Faça esse teste.