Error in updating Registration with EF

0

I'm having trouble updating a record, using ef. The key conflict error with relationship. Like I've been trying to add and not upgrade.

  

Additional information: A referential integrity constraint violation occurred: The property value (s) of 'Endereco.EnderecoId' on one end of a relationship do not match the property value (s) of 'Client.EnderecoId' on the other end .

public class Cliente
{
    public Int64 ClienteId { get; set; }
    public String Nome { get; set; }
    public String Email { get; set; }
    public String Cpf { get; set; }
    public String Rg { get; set; }
    public String TelFixo { get; set; }
    public String Celular { get; set; }
    public Int64 EnderecoId { get; set; }
    public virtual Endereco Endereco { get; set; }

}

public class Endereco
{
    public Int64 EnderecoId { get; set; }
    public Int64 CidadeId { get; set; }
    public Int64 EstadoId { get; set; }
    public String Rua { get; set; }
    public String Complemento { get; set; }
    public String CEP { get; set; }
    public String Bairro { get; set; }
    public String Numero { get; set; }
    public virtual Cidade Cidade { get; set; }
    public virtual Estado Estado { get; set; }
    public virtual ICollection<Cliente> ClienteList { get; set; }
}
    
asked by anonymous 05.11.2016 / 21:56

1 answer

1

Your modeling is incorrect. A Client has one or more Addresses, therefore:

[DisplayColumn("Nome")]
public class Cliente
{
    [Key]
    public Int64 ClienteId { get; set; }

    [Required]
    public String Nome { get; set; }
    [EmailAddress]
    public String Email { get; set; }

    public String Cpf { get; set; }
    public String Rg { get; set; }
    public String TelFixo { get; set; }
    public String Celular { get; set; }

    // Isto indica que 1 Cliente pertence a 1 Endereço.
    // public Int64 EnderecoId { get; set; }
    // public virtual Endereco Endereco { get; set; }

    // Isto indica que 1 Cliente tem N Endereços
    public virtual ICollection<Endereco> Enderecos { get; set; }
}

Endereco looks like this:

public class Endereco
{
    [Key]
    public Int64 EnderecoId { get; set; }
    public Int64 CidadeId { get; set; }
    public Int64 EstadoId { get; set; }

    // Este índice serve para dizer que um mesmo cliente não pode
    // ter dois endereços do mesmo tipo. 
    // Se quiser, apenas remova a anotação daqui e de TipoEndereco (mais abaixo).
    [Index("IXU_Endereco_ClienteId_TipoEnderecoId", Order = 1, IsUnique = true)]
    public Int64 ClienteId { get; set; }

    // Como boa prática para Endereco, crie uma enumeração que indica
    // o tipo do endereço.
    [Index("IXU_Endereco_ClienteId_TipoEnderecoId", Order = 2, IsUnique = true)]
    public TipoEndereco TipoEndereco { get; set; }

    public String Rua { get; set; }
    public String Complemento { get; set; }
    public String Cep { get; set; }
    public String Bairro { get; set; }
    public String Numero { get; set; }

    public virtual Cidade Cidade { get; set; }
    public virtual Estado Estado { get; set; }

    // Isto indica que 1 Endereço tem N clientes, o que está errado.
    // public virtual ICollection<Cliente> ClienteList { get; set; }

    // Isto indica que 1 Endereço pertence a 1 Cliente.
    public virtual Cliente Cliente { get; set; }
}

TipoEndereco :

public enum TipoEndereco
{
    Residencial,
    Comercial,
    Entrega,
    Cobranca
}
    
05.11.2016 / 22:35