How do I update my data in the table using EntityFramework?

5
 var contactado = ContactadoRepositorio.ObterListaContactadoPorCodigo(procedimentoVM.CodContactadoPessoa); //obtenho o contactado pelo id obtido;

 foreach (var c in contactado)
 {
     var contactadoPessoa = new ContactadoPessoa()
     {
         Codigo = c.Codigo,
         CodigoPessoa = c.CodigoPessoa,
         Nome = c.Nome,
         CodigoProcedimento = procedimento.Codigo
     };

     ContactadoRepositorio.Atualizar(contactadoPessoa);
 }

//Com o objeto obtido eu atualizo as propriedades que eu quero salvar no BD

public void Atualizar(ContactadoPessoa contactadoPessoa)
{
    this.Context.ContactadoPessoas.Attach(contactadoPessoa);
    this.Context.Entry(contactadoPessoa).State = EntityState.Modified;
    this.Context.SaveChanges();

}

//Metodo para Atualizar e salvar no BD  

When I run the code I get the following error:

  

Attaching an entity of type 'Strong.Tracker.Model.ContactedPerson'   failed because another entity of the same type has already 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' state entity to track the graph and then set the state of   non-new entities to 'Unchanged' or 'Modified' as appropriate

    
asked by anonymous 21.01.2015 / 13:35

4 answers

3

You do not need Attach for this case. Change to:

public void Atualizar(ContactadoPessoa contactadoPessoa)
{
    // this.Context.ContactadoPessoas.Attach(contactadoPessoa);
    this.Context.Entry(contactadoPessoa).State = EntityState.Modified;
    this.Context.SaveChanges();
}
    
24.06.2015 / 22:20
1

The simplest is to do this:

db is the context instantiated like this: nomeContext db = new nomeContext();

Then do this:

var registro = db.NomeDaTabela.FirstOrDefault(c => c.chavePrimaria);

registro.nome_do_campo1 = 'novo conteudo1';
registro.nome_do_campo2 = 'novo conteudo2';
.
.
.

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

The most common mistake is to want to create an object (record) like this from scratch without using the object itself that was located with FirstOrDefault (). If we assign the id and everything else in this record without it being located, the object we created is flawed and stick.

    
01.05.2017 / 05:14
1

You use attach only to add an entity to the context that is not yet being monitored by it.

Since your entity is already in context and you are modifying its properties, you can save the changes in context directly

this.Context.Entry(contactadoPessoa).State = EntityState.Modified;
this.Context.SaveChanges();

Or simply use the EntityState implicitly:

this.Context.SaveChanges();
    
01.05.2017 / 14:40
-1

Assuming that the CODE column is the primary key of the ContactPeople table. Try to do so

var contactado = ContactadoRepositorio.ObterListaContactadoPorCodigo(procedimentoVM.CodContactadoPessoa); //obtenho o contactado pelo id obtido;

 foreach (var c in contactado)
            {
                var contactadoPessoa = this.Context.ContactadoPessoas.FirstOrDefault(cp => cp.Codigo == c.Codigo);

                    contactadoPessoa.CodigoPessoa = c.CodigoPessoa,
                    contactadoPessoa.Nome = c.Nome,
                    contactadoPessoa.CodigoProcedimento = procedimento.Codigo

                ContactadoRepositorio.Atualizar(contactadoPessoa);
            }
//Com o objeto obtido eu atualizo as propriedades que eu quero salvar no BD

  public void Atualizar(ContactadoPessoa contactadoPessoa)
    {
        this.Context.ContactadoPessoas.Attach(contactadoPessoa);
        this.Context.Entry(contactadoPessoa).State = EntityState.Modified;
        this.Context.SaveChanges();

    }
    
21.01.2015 / 13:44