none
Deletar em "cascata" - EF RRS feed

  • Pergunta

  • Boa noite!

    Estou com um problema ao excluir os dados do Cliente.
    Minha entidade cliente tem relação com endereço, inss e outras entidades.
    O erro é quando faço a inserção de dados no CLIENTE e ENDEREÇO, e deixo o INSS em branco (não inseri nada na tabela inss), inseri os dados perfeitamente, mas quando vou excluir, ele inseri dados nulos na tabela INSS.
    Isso não acontece quando no cadastro, eu coloco dados no inss antes.

    Entidade Cliente

    public ClientePessoaFisica()
            {
                Endereco = new Endereco();
                Servidor = new Servidores();
                Inss = new INSS();
                Militar = new Militar();
            }
           
            [Required]
            [MaxLength(200)]
            public string Nome { get; set; }
            public string Cpf { get; set; }
            public string Rg { get; set; }
            public string OrgaoExpedidor { get; set; }
            public string Nacionalidade { get; set; }
            public string EstadoCivil { get; set; }
            public string Profissao { get; set; }
            public string TelefoneResidencial { get; set; }
            public string TelefoneComercial { get; set; }
            public string TelefoneCelular { get; set; }
            public DateTime? DataNascimento { get; set; }
            public string Email { get; set; }
    
            public virtual Endereco Endereco { get; set;}
            public virtual Servidores Servidor { get; set; }
            public virtual INSS Inss { get; set; }
            public virtual Militar Militar { get; set; }

    Entidade Endereço:

    public int Id { get; set; }
            public string Estado { get; set; }
            public string Cidade { get; set; }
            public string Bairro { get; set; }
            public string Logadouro { get; set; }
            public string Complemento { get; set; }
            public string Cep { get; set; }
            public string PontoReferencia { get; set; }
            public string Numero { get; set; }
    
            public virtual IEnumerable<ClientePessoaFisica> ClientePessoaFisica { get; set; }

    Entidade INSS:

    public int Id { get; set; }
            public DateTime? BeneficioDesde { get; set; }
            public string NumeroDoBeneficio { get; set; }
            public string ValorEquivalente { get; set; }
            public string ValorDaCausa { get; set; }
            public bool HabilitarINSS { get; set; }
    
            public virtual IEnumerable<ClientePessoaFisica> ClientePessoaFisica { get; set; }

    DALCliente - INSERIR

    try
                {
                    using (var banco = new BANCO())
                    {
    
                        entidade.DataCriacao = DateTime.Now;
    
                        entidade.Inss = entidade.Inss.HabilitarINSS == false ? null : entidade.Inss;
                        entidade.Servidor = entidade.Servidor.HabilitarServidor == false ? null : entidade.Servidor;
                        entidade.Militar = entidade.Militar.HabilitarMilitar == false ? null : entidade.Militar;
    
                        banco.ClientePessoaFisica.Add(entidade);
    
                        return banco.SaveChanges() > 0;
    
                    }
    
                }
                catch (Exception ex)
                {
    
                    throw ex;
                }

    DALCliente Excluir

    try
                {
                    using (var banco = new BANCO())
                    {
                        ClientePessoaFisica entidade = banco.ClientePessoaFisica.
                            Include(e => e.Endereco).
                            Include(i => i.Inss).
                            Include(m => m.Militar).
                            Include(s => s.Servidor).FirstOrDefault(x => x.Id == id);
    
                        
                        if (entidade.Endereco.Id > 0)
                            banco.Endereco.Remove(entidade.Endereco);
                        if (entidade.Inss.Id > 0)
                            banco.Inss.Remove(entidade.Inss);
                        if (entidade.Militar.Id > 0)
                            banco.Militar.Remove(entidade.Militar);
                        if (entidade.Servidor.Id > 0)
                            banco.Servidores.Remove(entidade.Servidor);
                        
    
                        banco.ClientePessoaFisica.Remove(entidade);
                        return banco.SaveChanges() > 0;
                    }
                }
                catch (Exception exc)
                {
    
                    throw exc;
                }

    Espero ter expressado bem.

    Obrigado!

    terça-feira, 7 de maio de 2013 00:18

Respostas

  • Acho que compreendi o problema.

    No método excluir, quando ele busca o cliente no banco de dados, ele coloca valores nulos em "INSS", mesmo não contendo.

    E não adianta eu fazer o seguinte, "Cliente.Inss = Null", mesmo assim continua com os dados nulos e acredito que o mais importa é o Cliente.Inss.Id = 0. Então ao fazer o SaveChanges o EF acredita que tem que inserir os dados. 
    Existe um método para retirar a instancia? Porque é criada no construtor da classe ClientePessoa Fisica, this.Inss = new Inss(). Pelo que o seu não tem como remover isso.

    Então mesmo que o Cliente.Inss.Id > 0 seja falso, é necessário remover também, então removi esta condição, independente do ID é removido também, e assim não insere ao deletar.

    Coisa simples mas foi canseira. 

    Abraço!

    quinta-feira, 9 de maio de 2013 17:24