3
respostas

Qual a melhor prática ?

Suponhamos um modelo de dados composto por 2 tabelas Tipo_Endereco e Endereco, onde o relacionamento entre elas é de 1 :N, ou seja, tipo endereço pode estar para muitos endereços, porém um endereço terá apenas 1 tipo endereço. Utilizando o Entity, para inserir registros na tabela Endereco, preciso necessariamente fazer uma busca antes em Tipo_endereco para adicionar este registro na propriedade TipoEndereco para que desta forma o registro de tipo_endereco esteja sendo monitorado pelo contexto e eu consiga inserir apenas o registro em Endereco. Existe alguma outra maneira de inserir dados em Endereco sem ter que buscar o tipo_endereco antes ? Tipo passando apenas o id de tipo_endereco previamente selecionado em tela pelo usuario ?

3 respostas

Olá Everton, tudo bem?

Acho que não entendi muito bem sua dúvida, mas você está se referindo a uma lista de endereços, que pode ter Endereço principal, Endereço comercial, Endereço da casa da tia`? Seria este tipo de solução, onde é possível manter vários endereços para um usuário e selecionar algum deles ou adicionar um novo?

Se for isso, você pode ter o objeto Endereco e no seu usuário ter um IList<Endereco> e na hora de chamar faz a chamada normal do usuário, e traz também os endereços .Include(u => u.Endereco).

Era sobre isso a sua dúvida?

No aguardo!

Isso mesmo, a idéia é ter vários endereços por pessoa (Cobrança, Comercial, Entrega, etc.) Perceba que a tabela tipo_endereco é uma tabela de apoio (dominio) apenas para armazenar os tipos de endereços, ela já vem populada através de meu script de criação da base de dados. Segue abaixo meu código, onde dentro do dao é que utilizo o Entity. Da forma que está implementado, ocorre erro de duplicate Key, no tipo_Endereco, pois o Entity tenta inserir este registro que já existe na tabela. Para não ocorrer este erro devo sempre fazer uma busca no tipo_endereco (para que o registro seja monitorado pelo changeTracker) e incluir no objeto endereco a referencia de tipo endereco retornado do banco. Meu questionamento é que sempre tenho que fazer essa query em tipo_endereco antes de inserir e atualizar?? Mesmo já tendo o IDTipoEndereco previamente selecionado em um combo?? Em modelos de dados onde tenho várias tabelas de apoio, não acumularia um excesso de querys de consultas previas apenas para incluir ou alterar um registro ??

 using (PessoaDAO dao = new PessoaDAO())
            {
                Pessoa p = new Pessoa
                {
                    Email = "teste222@teste.com.br",
                    NomeFantasia = "teca comercio e serviço 2",
                    NomeRazao = "teca Comércio e serviço LTDA ME 2",
                    NumCadastro = "55.555.555/0001-55",
                    NumInscricao = "2222222",
                    NumInscMunicipal = "2222",
                    TipoInscricao = Convert.ToChar("I"),
                    TipoPessoa = Convert.ToChar("J")
                };

                Endereco end = new Endereco
                {
                    Bairro = "Vila Albino",
                    Cep = "17300-000",
                    Cidade = "Barra Bonita",
                    Ativo = "S",
                    Padrao = Convert.ToChar("S"),
                    Logradouro = "Martha jose",
                    Numero = "343",
                    Uf = "SP",
                    TipoEndereco = new TipoEndereco { TipEnderecoId = 66}
                };

                Endereco end2 = new Endereco
                {
                    Bairro = "Centro",
                    Cep = "17340-000",
                    Cidade = "Barra Bonita",
                    Ativo = "S",
                    Padrao = Convert.ToChar("N"),
                    Logradouro = "Primeiro de Março",
                    Numero = "132",
                    Uf = "SP",
                    TipoEndereco = new TipoEndereco { TipEnderecoId = 68 }
                };

                p.Enderecos.Add(end);
                p.Enderecos.Add(end2);

                dao.Inserir(p);              

Então Everton, me parece que é mais simples que na classe Endereco tenha o campo IdPessoa que é do tipo int e ele vai ter um valor igual ao Id da classe Pessoa. Com isso, você coloca a referência direta para o "dono" daquele endereço.

Depois na hora de trazer os dados do seu repositório, você poderia usar algo do tipo:

var cadastro = dbset
.Include(p => p.Pessoa)
    .ThenInclude(p => p.Endereco)
.Where(p => p.Id == pessoaId);

Lembrando que pessoaId seja uma variável que contenha o Id que seja comum para Pessoa e Endereco.PessoaId.

Na hora de gravar um Endereco novo, ele seria gravado com o Id da Pessoa em questão.

Ao meu ver, deste modo, você teria uma ligação direta entre Pessoa e Endereco e na hora de pegar os dados do banco, seria bem mais simples para colocá-los em um lugar só, para poder manipular na sua aplicação.

O que acha desta solução?