Doubt when configuring entities relationship

Asked

Viewed 95 times

3

In a hypothesis, I have an entity to register addresses:

 public class Endereco
    {
        [Key]
        public int EnderecoId { get; set; }

        public string TipoLogradouro { get; set; }

        public string Logradouro { get; set; }

        public string NumLogradouro { get; set; }

        public string Complemento { get; set; }

        public string Bairro { get; set; }

        public int UFId { get; set; }

        public virtual Estado UF { get; set; }

        public int CidadeId { get; set; }

        public virtual Cidade Cidade { get; set; }

        public string CEP { get; set; }

        public bool Cobranca { get; set; }

        public bool Entrega { get; set; }

        public bool Fatura { get; set; }

        public int PessoaId { get; set; }

        public virtual IPessoa Pessoa { get; set; }
    }
}

This class has virtual properties UF and Cidade, as any good address worth its salt.

But, when configuring the relationships of Entity I came across the following question: If, for obvious reasons, all class cidade will necessarily have a property uf related, I would need to declare property uf also in class Endereco?

The most obvious answer for me would be NÃO, but, in this case, what would then be the most correct way to generate a View to register an address? And this would not "hinder", for example, a consultation of customers of a given state?

  • The option to replicate or not the given Uf in the address entity is personal. It will depend on your needs... For example, if there is no Uf in address then when registering a new address the user will be obliged to accept the Uf that comes when he selects the city. Now, if you want to let him change Uf then the Uf field has to be in the address entity.

1 answer

2


If, for obvious reasons, every city class will necessarily have a related Uf property, I would need to declare the Uf property also in the Address class?

If Endereco belongs to a Cidade, nay.

What would then be the most correct way to generate a View to register an address?

On a system I write, my Models are like that:

[DisplayColumn("Descricao")]
[Table("Logradouros")]
public class Logradouro : IEntidade, IPesquisavel
{
    [Key]
    public Guid LogradouroId { get; set; }
    public Guid BairroId { get; set; }

    [Required]
    [Index]
    [MaxLength(450)]
    public String Descricao { get; set; }
    public String DescricaoFonetizado { get; set; }
    [Index]
    [DisplayName("CEP")]
    public int Cep { get; set; }

    public virtual Bairro Bairro { get; set; }

    [DisplayName("Termo de Pesquisa")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public String TermoPesquisa
    {
        get { return Descricao + ", " + Cep.ToString(); }
        private set { }
    }

    [DisplayName("Última Modificação")]
    public DateTime UltimaModificacao { get; set; }
    [DisplayName("Data de Criação")]
    public DateTime DataCriacao { get; set; }
    [DisplayName("Usuário da Criação")]
    public String UsuarioCriacao { get; set; }
    [DisplayName("Usuário da Modificação")]
    public String UsuarioModificacao { get; set; }
}

[DisplayColumn("Nome")]
[Table("Bairros")]
public class Bairro : IEntidade, IPesquisavel
{
    [Key]
    public Guid BairroId { get; set; }
    public Guid CidadeId { get; set; }

    [Required]
    [Index]
    [MaxLength(450)]
    public String Nome { get; set; }
    public String NomeAbreviado { get; set; }
    public String NomeFonetizado { get; set; }

    public virtual Cidade Cidade { get; set; }
    [JsonIgnore]
    public virtual ICollection<Logradouro> Logradouros { get; set; }
    [JsonIgnore]
    public virtual ICollection<AgenciaBancaria> AgenciasBancarias { get; set; }
    [JsonIgnore]
    public virtual ICollection<ClientePrevidenciario> ClientesPrevidenciario { get; set; }
    [JsonIgnore]
    public virtual ICollection<Reclamante> Reclamantes { get; set; }

    [DisplayName("Termo de Pesquisa")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public String TermoPesquisa
    {
        get { return Nome; }
        private set { }
    }

    [DisplayName("Última Modificação")]
    public DateTime UltimaModificacao { get; set; }
    [DisplayName("Data de Criação")]
    public DateTime DataCriacao { get; set; }
    [DisplayName("Usuário da Criação")]
    public String UsuarioCriacao { get; set; }
    [DisplayName("Usuário da Modificação")]
    public String UsuarioModificacao { get; set; }
}

[Table("Cidades")]
public class Cidade : IEntidade, IPesquisavel
{
    [Key]
    public Guid CidadeId { get; set; }
    [DisplayName("Estado")]
    public Guid EstadoId { get; set; }
    [DisplayName("Código da Cidade no SAPC")]
    public int RcrCidadeId { get; set; }

    [Required(ErrorMessage = "O nome da cidade é obrigatório.")]
    [DisplayName("Nome")]
    [Index]
    [MaxLength(450)]
    public String Nome { get; set; }
    [DisplayName("Código no IBGE")]
    public int CodigoIbge { get; set; }
    [DisplayName("Código no SIAFI")]
    public int CodigoSiafi { get; set; }
    [DisplayName("CEP")]
    public int? Cep { get; set; }

    [JsonIgnore]
    public virtual Estado Estado { get; set; }
    [JsonIgnore]
    public virtual ICollection<Bairro> Bairros { get; set; }
    [JsonIgnore]
    public virtual ICollection<ClientePrevidenciario> ClientesPrevidenciario { get; set; }
    [JsonIgnore]
    public virtual ICollection<Reclamante> Reclamantes { get; set; }
    [JsonIgnore]
    public virtual ICollection<Foro> Foros { get; set; }
    [JsonIgnore]
    public virtual ICollection<Tribunal> Tribunais { get; set; }

    [DisplayName("Termo de Pesquisa")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public String TermoPesquisa
    {
        get { return Nome; }
        private set { }
    }

    [DisplayName("Última Modificação")]
    public DateTime UltimaModificacao { get; set; }
    [DisplayName("Data de Criação")]
    public DateTime DataCriacao { get; set; }
    [DisplayName("Usuário da Criação")]
    public String UsuarioCriacao { get; set; }
    [DisplayName("Usuário da Modificação")]
    public String UsuarioModificacao { get; set; }
}

[Table("Estados")]
public class Estado : IEntidade, IPesquisavel
{
    [Key]
    public Guid EstadoId { get; set; }
    [DisplayName("País")]
    public Guid PaisId { get; set; }

    [Required(ErrorMessage = "O nome do país é obrigatório.")]
    [DisplayName("Nome")]
    public String Nome { get; set; }
    [Required(ErrorMessage = "A sigla do país é obrigatória.")]
    [DisplayName("Sigla")]
    public String Sigla { get; set; }

    public virtual Pais Pais { get; set; }

    public virtual ICollection<Cidade> Cidades { get; set; }

    [DisplayName("Termo de Pesquisa")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public String TermoPesquisa
    {
        get { return Nome; }
        private set { }
    }

    [DisplayName("Última Modificação")]
    public DateTime UltimaModificacao { get; set; }
    [DisplayName("Data de Criação")]
    public DateTime DataCriacao { get; set; }
    [DisplayName("Usuário da Criação")]
    public String UsuarioCriacao { get; set; }
    [DisplayName("Usuário da Modificação")]
    public String UsuarioModificacao { get; set; }
}

[Table("Paises")]
public class Pais : IEntidade, IPesquisavel
{
    [Key]
    public Guid PaisId { get; set; }

    [Required(ErrorMessage = "O nome do país é obrigatório.")]
    [DisplayName("Nome")]
    public String Nome { get; set; }
    [Required(ErrorMessage = "A sigla do país é obrigatória.")]
    [DisplayName("Sigla")]
    public String Sigla { get; set; }

    public virtual ICollection<Estado> Estados { get; set; }

    [DisplayName("Termo de Pesquisa")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public String TermoPesquisa
    {
        get { return Nome; }
        private set { }
    }

    [DisplayName("Última Modificação")]
    public DateTime UltimaModificacao { get; set; }
    [DisplayName("Data de Criação")]
    public DateTime DataCriacao { get; set; }
    [DisplayName("Usuário da Criação")]
    public String UsuarioCriacao { get; set; }
    [DisplayName("Usuário da Modificação")]
    public String UsuarioModificacao { get; set; }
}

An address would be linked to a neighborhood, which would be linked to a city, which would be linked to a state, which would be linked to a country.

And this would not "hinder", for example, a consultation of customers of a given state?

No, because using Entity Framework you can search like this:

var enderecos = db.Enderecos.Where(e => e.Bairro.Cidade.EstadoId == id);
  • 1

    Great! I was thinking something along the way, I just didn’t know if it was ideal. Thanks for the examples.

Browser other questions tagged

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