none
CRUD com relacionamento Many to Many RRS feed

  • 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

    quarta-feira, 15 de janeiro de 2014 13:39

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
    quarta-feira, 15 de janeiro de 2014 15:01
  • 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.
    quarta-feira, 15 de janeiro de 2014 15:33
  • 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
    quarta-feira, 15 de janeiro de 2014 17:40
  • 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

    quarta-feira, 15 de janeiro de 2014 18:28
  • 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:

    1. Meu EDM
    2. 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.


    quarta-feira, 15 de janeiro de 2014 23:07
  • Certo, mas olhando as boas práticas de programação será que isso seria o ideal? pois nos paradigmas de banco de dados isso ai seria meio que uma gambiarra! o termo "meio perdido" será que teria uma solução? 

    Obrigado por enquanto!

    quarta-feira, 15 de janeiro de 2014 23:27
  • 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           2

    Supondo que não as chaves estrangeiras não seja uma PK composta, se você inserir novamente

    Produto Tipo
    1            1

    Vai 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.

    quinta-feira, 16 de janeiro de 2014 00:14