asp.net-mvc-5 – Doubt when configuring entity relationships

Question:

In one case, 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 the virtual properties UF and Cidade , like any good address worth its salt.

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

The most obvious answer for me would be NÃO , but in this case, what would be the most correct way to generate a View to register an address? And wouldn't that "make it difficult", for example, a consultation of customers from a certain state?

Answer:

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

If Endereco belongs to a Cidade , no.

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

In a system I write, my Models look like this:

[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 wouldn't that "make it difficult", for example, a consultation of customers from a certain state?

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

var enderecos = db.Enderecos.Where(e => e.Bairro.Cidade.EstadoId == id);
Scroll to Top