none
Erro ao tentar dar update na tabela de Relacionamento com EF 6.1 RRS feed

  • Pergunta

  • Galera estou com um problema. 

    Na minha tabela de relacionamento tenho duas PK's / FK's essa tabela é apenas para relacionamento Many to Many.

    O problema é que quando eu vou atualizar um registro dessa tabela ela me dá a seguinte menssagem

     

    Essa é minha tabela: 

    Já tentei utilizar o EntityState.Modified e EntityState.Detached e o mesmo erro acontece. 

    O que pode ser?

    quarta-feira, 13 de agosto de 2014 17:54

Respostas

  • Olá Fernando,

     entendi, esse update é mais trabalhoso quando é usado com uma classe genérica, mas olhando sua estrutura na tabela ParametroJoinEmpresa falta a coluna Id ou seja a chave primaria da tabela, aquela por padrão colocamos auto-incremento... Pois o entity necessita de uma PK para fazer o CRUDE veja como fica sem os relacionamentos apenas a simulação dos campos :

    CREATE TABLE [dbo].[ParametroJoinEmpresa](
    	[IdParametro] [int] NOT NULL,
    	[IdEmpresa] [int] NOT NULL,
    	[Id] [int] IDENTITY(1,1) NOT NULL,
     CONSTRAINT [PK_ParametroJoinEmpresa] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     Quando criar essa coluna seu código vai funcionar.

    • Marcado como Resposta Fernando Mamprin quinta-feira, 14 de agosto de 2014 12:02
    quinta-feira, 14 de agosto de 2014 10:53

Todas as Respostas

  • Olá Fernando, 

     com o EF6.1 é um pouco diferente a forma de fazer Update como você está fazendo essa atualização ? É uma classe genérica, poste o bloco de código para analisarmos...

    quarta-feira, 13 de agosto de 2014 18:13
  • Fala Daniel o código é bem simples:

     var join = db.RE_ParametroEmpresas.Where(j => j.IdParametro == model.codParametro && j.IdEmpresa == model.codEmpresaAlt)
                               .Select(j => j)
                               .FirstOrDefault();
                        
    if (join != null)
    {
         join.IdEmpresa = model.codEmpresa;
         join.IdParametro = model.codParametro;
    
         db.SaveChanges();
                              
    }

    quarta-feira, 13 de agosto de 2014 18:15
  • Entendi,

     só pra finalizar como está a estrutura dessas tabelas no sql o script das duas para ver as chaves e o relacionamento para finalizar.

    quarta-feira, 13 de agosto de 2014 18:46
  • Entendi,

     só pra finalizar como está a estrutura dessas tabelas no sql o script das duas para ver as chaves e o relacionamento para finalizar.

    Esse é o diagrama. Simples. Não entendo esse erro.

    quarta-feira, 13 de agosto de 2014 18:50
  • Olá Fernando,

     entendi, esse update é mais trabalhoso quando é usado com uma classe genérica, mas olhando sua estrutura na tabela ParametroJoinEmpresa falta a coluna Id ou seja a chave primaria da tabela, aquela por padrão colocamos auto-incremento... Pois o entity necessita de uma PK para fazer o CRUDE veja como fica sem os relacionamentos apenas a simulação dos campos :

    CREATE TABLE [dbo].[ParametroJoinEmpresa](
    	[IdParametro] [int] NOT NULL,
    	[IdEmpresa] [int] NOT NULL,
    	[Id] [int] IDENTITY(1,1) NOT NULL,
     CONSTRAINT [PK_ParametroJoinEmpresa] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     Quando criar essa coluna seu código vai funcionar.

    • Marcado como Resposta Fernando Mamprin quinta-feira, 14 de agosto de 2014 12:02
    quinta-feira, 14 de agosto de 2014 10:53
  • Valeu Daniel. 

    Na verdade eu estou utilizando chave composta. 

    E trocando uma ideia com um parceiro meu ontem ele me disse que a chave composta pro EF é zica, e que mesmo na table de relacionamento ele faz exatamente como você mencionou, cria uma coluna ID. 

    Valeu pelo retorno, isso vai me ajudar. 

    Abraço.

    quinta-feira, 14 de agosto de 2014 12:01