none
Erro estranho em Update Entity Frameework RRS feed

  • Pergunta

  • Galera um erro estranho no entity framework, eu consigo de boa gravar um dado em uma tabela, mais na hora de editar ocorre esse erro:


    An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code

    Additional information: Attaching an entity of type 'Eita_Que_Fome.Models.segUsuario' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

    Esse é meu método Editar:

     public void editaUsuario(segUsuario usuario)
            {
                ctx.Entry(usuario).State = System.Data.Entity.EntityState.Modified;
                ctx.segUsuario.Attach(usuario);
                ctx.SaveChanges();
            }

    • Editado Raniel Nogueira sexta-feira, 13 de fevereiro de 2015 17:48
    • Movido welington jr quinta-feira, 23 de novembro de 2017 13:32 forum certo
    sexta-feira, 13 de fevereiro de 2015 17:45

Respostas

  • Caro Raniel

      Tente assim:

    public void editaUsuario(segUsuario usuario)
    {
                
    var local = context.Set<EntidadeUsuario>()
                             .Local
                             .FirstOrDefault(f => f.Codigo == usuario.Codigo);
    
                        context.Entry(local).State = System.Data.Entity.EntityState.Detached;
                        context.Entry(segUsuario ).State = System.Data.Entity.EntityState.Modified;
                        context.SaveChanges();
    }

    • Sugerido como Resposta Dell_ quinta-feira, 18 de fevereiro de 2016 16:42
    • Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 27 de novembro de 2017 11:44
    sexta-feira, 25 de setembro de 2015 12:09

Todas as Respostas

  • Acredito que a entidade que vc está manipulando veio de uma View e isso tenha gerado este problema com o estado do registro.

    Uma solução seria localizar via query LINQ o registro a ser alterado no método editaUsuario e, na sequência, atribuir os valores que foram modificados na View ao objeto que vc encontrou.

    Desconfio que da forma como vc fez pode estar errado, já que em muitos exemplos da Internet o método Attach é invocado antes da mudança no estado do registro. Tente inverter isso então, como indicado a seguir:

    public void editaUsuario(segUsuario usuario)
    {
                ctx.segUsuario.Attach(usuario);
                ctx.Entry(usuario).State = System.Data.Entity.EntityState.Modified;
                ctx.SaveChanges();
    }
    

    Por fim, no link abaixo foram listadas várias estratégias para a atualização de registros no Entity Framework:


    http://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record

    Espero ter ajudado.

    Abs

    domingo, 15 de fevereiro de 2015 14:58
  • Galera um erro estranho no entity framework, eu consigo de boa gravar um dado em uma tabela, mais na hora de editar ocorre esse erro:


    An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code

    Additional information: Attaching an entity of type 'Eita_Que_Fome.Models.segUsuario' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

    Esse é meu método Editar:

     public void editaUsuario(segUsuario usuario)
            {
                ctx.Entry(usuario).State = System.Data.Entity.EntityState.Modified;
                ctx.segUsuario.Attach(usuario);
                ctx.SaveChanges();
            }

    Faça um teste, remova a linha do Attach deixe somente o State e SaveChanges.

    Leonardo Lourenço Silva


    • Sugerido como Resposta Daniel Brito br quarta-feira, 18 de fevereiro de 2015 13:13
    terça-feira, 17 de fevereiro de 2015 01:25
  • Já fiz isso, coloquei o Attach() já para tentar solucionar isso, mais retorna o mesmo erro.
    quarta-feira, 18 de fevereiro de 2015 12:13
  • Já fiz isso, coloquei o Attach() já para tentar solucionar isso, mais retorna o mesmo erro.

    Olá Raniel, 

     para Update não há necessidade de usar o Attach veja :

    public void Atualizar(TEntity obj)
            {
                ctx.Entry(obj).State = EntityState.Modified;
                ctx.SaveChanges();
            }

     Traduzindo isso a seu codigo seria :

    public void Atualizar(segUsuario obj)
            {
                ctx.Entry(obj).State = EntityState.Modified;
                ctx.SaveChanges();
            }

     Desse modo gera algum erro ?

    • Marcado como Resposta Raniel Nogueira quinta-feira, 19 de fevereiro de 2015 16:18
    • Não Marcado como Resposta Raniel Nogueira quinta-feira, 19 de fevereiro de 2015 16:18
    quarta-feira, 18 de fevereiro de 2015 13:17
  • Eu sei que não precisa do attach, sim gera um erro:

    An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code

    Additional information: Attaching an entity of type 'Eita_Que_Fome.Models.segUsuario' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

    quinta-feira, 19 de fevereiro de 2015 16:29
  • Pq vc não executa uma nova consulta LINQ sobre o seu contexto e atribui os novos valores à instância que deve ser modificado? Aparentemente, seu problema acontece pq vc está usando um objeto que foi modificado após a conexão com a base ter se fechado.
    quinta-feira, 19 de fevereiro de 2015 16:57
  • Como isso pode acontecer? se passo o valor a partir da view de edição? e depois que executo o update e salvo.
    quinta-feira, 19 de fevereiro de 2015 17:26
  • Como isso pode acontecer? se passo o valor a partir da view de edição? e depois que executo o update e salvo.
    Olá Raniel, qual a versão do Entity isso acontecia na versão 6.1.0 na atual 6.1.2 não acontece isso ! 
    quinta-feira, 19 de fevereiro de 2015 17:32
  • Minha versão: Version=6.0.0.0
    quinta-feira, 19 de fevereiro de 2015 17:38
  • Minha versão: Version=6.0.0.0
     Atualize via Nuget para a versão mais recente se não me engano é a 6.1.2 que vai funcionar da maneira que postei acima, nessa versão tem esse erro mesmo...
    quinta-feira, 19 de fevereiro de 2015 18:18
  • Minha versão: Version=6.0.0.0

     Atualize via Nuget para a versão mais recente se não me engano é a 6.1.2 que vai funcionar da maneira que postei acima, nessa versão tem esse erro mesmo...

    Não entendo porque o meu webconf não atualiza a versão, vejam:

      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

    quinta-feira, 19 de fevereiro de 2015 19:03
  • Minha versão: Version=6.0.0.0

     Atualize via Nuget para a versão mais recente se não me engano é a 6.1.2 que vai funcionar da maneira que postei acima, nessa versão tem esse erro mesmo...

    Não entendo porque o meu webconf não atualiza a versão, vejam:

      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

    Olá, mas você consegue atualizar ? Foi na aba Project "Manage Nuget Package" na aba search buscou Entity Framework ? Depois seria somente clicar em instalar e vai alterar a versão... Qual procedimento está fazendo para atualizar ?
    sexta-feira, 20 de fevereiro de 2015 12:07
  • Raniel, está correto Version=6.0.0.0 é a versão da dll e não do Entity, o Entity com certeza deve estar na última versão, esse método editaUsuario está em qual projeto? no seu MVC? quantos projetos você está usando?

    Diego Neves |Analista Desenvolvedor .NET
    MCP | Microsoft Specialist | MCSD Web Applications | ITIL® V3 Foundation 

    sexta-feira, 20 de fevereiro de 2015 13:23
  • Caro Raniel

      Tente assim:

    public void editaUsuario(segUsuario usuario)
    {
                
    var local = context.Set<EntidadeUsuario>()
                             .Local
                             .FirstOrDefault(f => f.Codigo == usuario.Codigo);
    
                        context.Entry(local).State = System.Data.Entity.EntityState.Detached;
                        context.Entry(segUsuario ).State = System.Data.Entity.EntityState.Modified;
                        context.SaveChanges();
    }

    • Sugerido como Resposta Dell_ quinta-feira, 18 de fevereiro de 2016 16:42
    • Marcado como Resposta AndreAlvesLimaModerator segunda-feira, 27 de novembro de 2017 11:44
    sexta-feira, 25 de setembro de 2015 12:09
  • Ele está dando o erro de PrimaryKey que já existe no contexto da aplicação.

    O problema está antes de passar para o editUsuario!

    Por favor coloque toda a programação na tag "Inserir Bloco de Código" porque o problema vem antes! Para que eu possa tentar te ajudar?


    Fulvio Cezar Canducci Dias

    sexta-feira, 25 de setembro de 2015 12:39
  • Diogo Areas, funcionou perfeitamente! Obrigado
    sexta-feira, 15 de janeiro de 2016 16:12
  • Sensacional, Diogo! Exatamente o que eu procurava. ^^v
    quinta-feira, 18 de fevereiro de 2016 16:42
  • Diogo, 

    No meu caso avançei no erro, porém tenho um entity em nivel filho que está apresentando o mesmo problema


            public void Update(PreVenda obj)
            {

                var local = _db.Set<PreVenda>()
                             .Local
                             .FirstOrDefault(f => f.IdPreVenda == obj.IdPreVenda);

                _db.Entry(local).State = EntityState.Detached;
                _db.Entry(obj).State = EntityState.Modified;
                _db.SaveChanges();

            } 
    quinta-feira, 29 de setembro de 2016 17:13
  • Mt obrigado Diogo Areas, resolveu meu problema.
    quinta-feira, 23 de novembro de 2017 11:20