Error updating Record with EF

Asked

Viewed 224 times

0

I’m having a hard time updating a record, using Ef. Relationship key conflict error. As if I’ve been trying to add and not update.

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; }
}
  • 1

    Does an address have multiple customers? Does a customer belong to only one address? That’s right?

  • Gypsy, I took this relationship, I kept only the client and continued the mistake.

1 answer

1

Your modeling is incorrect. A Customer 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 gets 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
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.