Entity Framework: Operações CRUD em situações de relacionamento muitos para muitos

Olá pessoal, tudo bom?

Compartilho neste post um exemplo (ASP.NET + Class Library) que fiz para meus alunos onde temos uma situação de CRUD (insert, update, delete, select) em um relacionamento muitos para muitos usando Entity Framework – EF. Veja o modelo de dados abaixo:

Modelo de Dados
Modelo de Dados onde observamos uma situação de relacionamento Muitos para Muitos

No exemplo, simulo um formulário onde se pode inserir um item e ao mesmo tempo indicar quais as coleções relacionadas ao mesmo, por exemplo, posso cadastrar um item “Fusca” já indicando que ele pertence às coleções “Miniaturas”, “Veículos” e “Brinquedos”.

Assim como explicado para a operação de cadastro, também temos a mesma ideia para as ações de exclusão, alteração e consulta.

diskettePara conhecer os detalhes do exemplo e também a codificação utilizada, faça o download da solução do Visual Studio que contempla o assunto que estamos tratando aqui.

Espero ajudar!

Grande abraço,
Eduardo Henrique Rizo

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

2 comentários em “Entity Framework: Operações CRUD em situações de relacionamento muitos para muitos”

  1. Olá Eduardo,

    Nesse seu exemplo não existe, no modelo, um objeto “ColecoesItens” pois é feito apenas o relacionamento entre as duas tabelas. Mas e se existisse uma outra propriedade na tabela Colecoes_Itens, como por exemplo clc_ite_quantidade, nesse caso seria criada uma nova entidade no modelo, “ColecoesItens” e a entidade Colecoes teria um list de “ColecoesItens” e não de “Itens”, correto?
    Agora pergunto, no momento de inserir uma nova Colecao, eu alimentando a list de ColecoesItens com objetos ColecoesItens informando a esse objeto apenas as propriedades ite_codigo e clc_ite_quantidade o EF vai atribuir automaticamente o valor da clc_codigo quando ela for criada? Pois no momento ela ainda não existe no banco.

    Estou fazendo um projeto que na venda estou com esse problema, quando dou o SaveChanges dá o seguinte problema: As alterações no banco de dados foram confirmadas com êxito, mas ocorreu um erro ao atualizar o contexto do objeto. O ObjectContext pode estar em estado inconsistente. Mensagem de exceção interna: Ocorreu uma violação de restrição de integridade referencial: os valores de propriedade que definem as restrições referenciais não são consistentes entre objetos principais e dependentes na relação.

    No caso, a Venda é gravada no banco, mas os produtos da venda não são gravados na tabela ProdutosVenda.

    Se não utilizo o Attach dá certo, registra a venda e os produtos da venda, mas cadastra de novo os produtos.

    1. Olá Diego, tudo bom?
      1) Você está certo em suas colocações sobre a existência ou não da entidade “ColecoesItens” do meu exemplo.
      2) Se você inserir uma nova “Colecao” com uma lista de “ColecoesItens” o EF irá inserir automaticamente também na tabela Colecoes_Itens.
      3) Quanto a questão do Attach, será necessário que você o utilize pois senão fatalmente você terá duplicidades dos seus produtos. Devemos sempre lembrar que se o modelo conceitual do EF não conhecer um objeto, a tendência natural dele é tentar inserir no BD, por isso, nesse caso que você colocou o uso do Attach é fundamental.

      Veja outro exemplos de attach no post abaixo:
      https://www.eduardorizo.com.br/2013/11/25/exemplo-de-insercao-muitos-para-muitos-usando-ef5-class-library-linq-e-asp-net/

      Abraços,
      Eduardo H. Rizo

Deixe um comentário