Erro: IvalidOperationException was unhandled by user code

02/05/2016

0

Bom dia, estou com dificuldades para fazer um update no banco de dados.

Eu preciso atualizar duas tabelas nesse update, a tabela de Funcionários e uma tabela de Eventos. Antes de salvar os dados na tabela funcionários eu estou verificando se houve alteração em 3 campos, se houver eu salvo o que foi alterado, até ai funcionar, ele salva os dados na tabela Eventos e quando vai salvar os dados na tabela Funcionários da esse erro:
IvalidOperationException was unhandled by user code

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

Additional information: Attaching an entity of type 'AppFuncionarios.Models.Funcionarios' 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.


Em relação ao código, eu estou utilizando 3 IFs para verificar os campos, pq cada alteração tem representa um tipo de evento. Pelo o que eu entendi esse erro é causado por que 2 objetos estão utilizando a mesma chave primaria. Como eu faço para resolver isso?

Segue meu código:
public ActionResult Teste(long id)
        {
            var funcionario = db.Funcionarios.Find(id);

            ViewBag.IDArea = new SelectList(db.Areas, "IDArea", "Nome", funcionario.IDArea);
            ViewBag.IDCargo = new SelectList(db.Cargos, "IDCargo", "Nome", funcionario.IDCargo);
            ViewBag.IDEmpregador = new SelectList(db.Empregadores, "IDEmpregador", "Nome", funcionario.IDEmpregador);

            return View(funcionario);
        }

        [HttpPost]
        public ActionResult Teste(Funcionarios funcionario, Eventos evento)
        {
            var olds = db.Funcionarios.Find(funcionario.IDFuncionario);

            if (ModelState.IsValid)
            {
                if (olds.IDArea != funcionario.IDArea)
                {
                    var novaArea = db.Areas.First(x => x.IDArea == funcionario.IDArea);

                    evento.IDFuncionario = funcionario.IDFuncionario;
                    evento.IDTipoDeEvento = 1; //mudança de área
                    evento.NovoValor = novaArea.Nome;
                    evento.DataAlteracao = DateTime.Now;

                    db.Eventos.Add(evento);
                    db.SaveChanges();
                }

                if (olds.IDCargo != funcionario.IDCargo)
                {
                    var novoCargo = db.Cargos.First(x => x.IDCargo == funcionario.IDCargo);

                    evento.IDFuncionario = funcionario.IDFuncionario;
                    evento.IDTipoDeEvento = 2; //mudança de cargo
                    evento.NovoValor = novoCargo.Nome;
                    evento.DataAlteracao = DateTime.Now;

                    db.Eventos.Add(evento);
                    db.SaveChanges();
                }

                if (olds.IDEmpregador != funcionario.IDEmpregador)
                {
                    var novoEmpregador = db.Empregadores.First(x => x.IDEmpregador == funcionario.IDEmpregador);

                    evento.IDFuncionario = funcionario.IDFuncionario;
                    evento.IDTipoDeEvento = 3; //mudança de Empregador
                    evento.NovoValor = novoEmpregador.Nome;
                    evento.DataAlteracao = DateTime.Now;

                    db.Eventos.Add(evento);
                    db.SaveChanges();
                }

                //salvando as informações na tabela funcionarios
                funcionario.StatusFunc = "Ativo";
                funcionario.UltimaAtualizacao = DateTime.Now;

                db.Entry(funcionario).State = EntityState.Modified;
                db.SaveChanges();

                //se tudo der certo, volta para lista de funcionários
                return RedirectToAction("Index");
            }

            //se as condições não forem sadisfeitas retorna para a view os dados do funcionario
            return View(funcionario);
        }



Obrigado.
Ricardo

Ricardo

Responder

Posts

03/05/2016

Ricardo

Ninguém?

Os comandos estão corretos, quando executados separadamente os dois comandos funcionam, porem eu preciso executa-los na mesma action, mas quando o UPDATE é chamado ele quer fazer um INSERT, por isso da erro... Na verdade ele salva os dados alterados na tabela EVENTOS, mas não salva as alterações na tabela FUNCIONARIOS, o erro é mostrado na linha:
db.Entry(funcionario).State = EntityState.Modified;


Tirei os comandos do ActionResult e criei 2 métodos void, um para verificar se houve alterações nos campos que preciso guardar (INSERT) na tabela EVENTOS e outro para salvar (UPDATE) as alterações na tabela FUNCIONARIOS.

E chamei os métodos no ActionResult, mas deu o mesmo erro...
Responder

06/05/2016

Ricardo

Consegui resolver....

Os métodos não podem ficar na mesma classe, coloquei o método que verifica os eventos na classe de EventosController e só chamei ele na action da classe FuncionariosController.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar