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);
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.
– Ricardo