none
Entity Framework - UPDATE não funciona. RRS feed

  • Pergunta

  • Boa noite galera,

    Estou tendo problemas em fazer um update em uma entidade que possui uma lista de detalhes. Exemplo:

    public class Pessoa
    {
      public int Id { get; set; }
      public string Nome { get; set; }
      public virtual ICollection<Livro> Livros { get; set; }
    }
    
    public class Livro
    {
      public int Id { get; set; }
      public string Nome { get; set; }
      public int IdPessoa { get; set; }
    }
    
    Public class Teste
    {
      public void Atualizar()
      {
         Pessoa pessoa = (Pessoa)Context.Set<Pessoa >().Find(1);
         pessoa.Livros.Add(new Livro() { Nome = "Livro1" });
         Context.Entry(Pessoa).State = EntityState.Modified;
         Context.SaveChanges();
      }
    }

    Lembrando que na inclusão de um registro novo, funciona, pois uso o Context.Set<T>().Add(entity);

    Só não funciona no update.

    domingo, 12 de abril de 2015 03:48

Respostas

  • Enfim, consegui resolver o meu problema.
    Acontece que o EF não atualiza automaticamente os ítens inseridos na lista de uma entidade já existente. Então, tive que fazer da seguinte forma:

      public void Atualizar()
      {
         Pessoa pessoa = (Pessoa)Context.Set<Pessoa >().Find(1);
         pessoa.Livros.Add(new Livro() { Nome = "Livro1" });
         foreach(var livro in pessoa.Livros)
         {
             livro.IdPessoa = pessoa.Id;
             Context.Entry(livro).State = livro.Id.Equals(0) ? EntityState.Added : EntityState.Modified;
         }
         Context.Entry(Pessoa).State = EntityState.Modified;
         Context.SaveChanges();
      }

    Eu não sei se essa é a forma mais correta e/ou elegante de se fazer, mas foi a única solução viável que encontrei.

    domingo, 12 de abril de 2015 20:44

Todas as Respostas

  • Alexandre,

    Faço um teste preenchendo a propriedade IdPessoa também, ao criar uma nova instância do tipo Livro. Talvez possa ser este o problema.

    domingo, 12 de abril de 2015 13:38
  • Renato, já fiz. E mesmo assim não deu certo.
    Fiz um teste da seguinte forma:

    no ActionResult Edit(), recuperei o registro, adicionei o livro e salvei. Deu certo. Porém, quando preencho ele dentro do form na view, ele não salva.

    Outra coisa, quando tenho um registro de livros já cadastrado, na view ele aparece normalmente, porém, ao salvar, no action da ação salvar, ele retorna a lista de livros em branco.

    Lembrando que trabalho com o model Pessoa

    domingo, 12 de abril de 2015 14:01
  • Enfim, consegui resolver o meu problema.
    Acontece que o EF não atualiza automaticamente os ítens inseridos na lista de uma entidade já existente. Então, tive que fazer da seguinte forma:

      public void Atualizar()
      {
         Pessoa pessoa = (Pessoa)Context.Set<Pessoa >().Find(1);
         pessoa.Livros.Add(new Livro() { Nome = "Livro1" });
         foreach(var livro in pessoa.Livros)
         {
             livro.IdPessoa = pessoa.Id;
             Context.Entry(livro).State = livro.Id.Equals(0) ? EntityState.Added : EntityState.Modified;
         }
         Context.Entry(Pessoa).State = EntityState.Modified;
         Context.SaveChanges();
      }

    Eu não sei se essa é a forma mais correta e/ou elegante de se fazer, mas foi a única solução viável que encontrei.

    domingo, 12 de abril de 2015 20:44