Foreingkey is not updated

0

I am not able to change a foreingkey field in the database. In my case, the objects (TypeEndereco = 3 and Endereco = 2) already exist.

Follow the template (simple):

public class Endereco
{
    public int Id { get; set; }
    public string Cep { get; set; }
    public string Logradouro { get; set; }
    public string Bairro { get; set; }
    public string Cidade { get; set; }
    public string Uf { get; set; }
    public TipoEndereco Tipo { get; set; }
}

public class TipoEndereco
{
    public int Id { get; set; }
    public string Nome { get; set; }
}

I am changing the following address data form:

        TipoEnderecoBLO teblo = new TipoEnderecoBLO();
        EnderecoBLO eblo = new EnderecoBLO();

        TipoEndereco te = new TipoEndereco();
        te.Id = 3;

        Endereco e = new Endereco();
        e.Bairro = "Casa Grande";
        e.Cep = "22.723-002";
        e.Cidade = "Rio de Janeiro";
        e.Logradouro = "Estrada do Mapuá";
        e.Uf = "RJ";
        e.Tipo = te;//aqui estou mudando o tipo de endereço
        e.Id = 2;
        eblo.Update(e);

When you send the command:

_context.Entry(endereco).State = EntityState.Modified;
_context.SaveChanges();

Some address data is changed, but the address type (ID_type) is not changed in the database.

Can anyone help me?

    
asked by anonymous 17.05.2017 / 19:27

1 answer

1

The mode with which you are assigning the Address Type is incorrect:

    TipoEndereco te = new TipoEndereco();
    te.Id = 3;

There are two ways to do this: either you select Address Type 3, or you create an address type 3 and attach it to the context for it to be observed.

Another thing is that the Address needs to be selected before it changes.

Approach 1: Selecting from context

    var te = contexto.TiposEndereco.FirstOrDefault(te => te.Id == 3);
    var e = contexto.Enderecos.FirstOrDefault(e => e.Id == 2);

    e.Bairro = "Casa Grande";
    e.Cep = "22.723-002";
    e.Cidade = "Rio de Janeiro";
    e.Logradouro = "Estrada do Mapuá";
    e.Uf = "RJ";
    e.Tipo = te;//aqui estou mudando o tipo de endereço
    e.Id = 2;

    contexto.Entry(e).State = EntityState.Modified;
    contexto.SaveChanges();

Approach 2: Attaching an incomplete object to the context

    TipoEndereco te = new TipoEndereco();
    te.Id = 3;

    contexto.TiposEnderecos.Attach(te); // Dará erro se Id == 3 não existir.
    var e = contexto.Enderecos.FirstOrDefault(e => e.Id == 2);

    Endereco e = new Endereco();
    e.Bairro = "Casa Grande";
    e.Cep = "22.723-002";
    e.Cidade = "Rio de Janeiro";
    e.Logradouro = "Estrada do Mapuá";
    e.Uf = "RJ";
    e.Tipo = te;//aqui estou mudando o tipo de endereço
    e.Id = 2;

    contexto.Entry(e).State = EntityState.Modified;
    contexto.SaveChanges();
    
17.05.2017 / 19:32