none
Erro ao salvar dados em uma tabela com chave FK. RRS feed

  • Pergunta

  • Olá a todos,
    Estou usando: Entity Framework

    No banco de dados:
    Tenho um tabela cliente e uma tabela empresa;
    Na tabela cliente tenho um compo Empres_Id que é uma FK da tabela empresa;
    Fiz uma rotina para cadastro e atualização como mostra o código abaixo:

    void Atualizar()
    {
    try
    {
    using (var ctx = new sigproEntities())
    {
    var atualiza = ctx.cliente.FirstOrDefault(c => c.Id == Cliente.Id);
    if (rbAtivo.Checked)
    {
    aux = "A";
    }
    if (rbInativo.Checked)
    {
    aux = "I";
    }

    if (cbTipo.Text == "CPF")
    {
    atualiza.DTCadastro = Convert.ToDateTime(mtbDtCadastro.Text);
    atualiza.Tipo = cbTipo.Text;
    atualiza.SituacaoCliente = aux;
    atualiza.Nome = txtNome.Text;
    atualiza.Endereco = txtEndereco.Text;
    atualiza.Complemento = txtComplemento.Text;
    atualiza.Bairro = txtBairro.Text;
    atualiza.Cep = mtbCep.Text.Replace(".", "").Replace("-", "");
    atualiza.Cidade = txtCidade.Text;
    atualiza.Estado = txtUf.Text;
    atualiza.TelFixo = mtbTelFixo.Text.Replace("(", "").Replace(")", "").Replace("-", "");
    atualiza.TelCelular = mtbTelCelular.Text.Replace("(", "").Replace(")", "").Replace("-", "");
    atualiza.Email = txtEmail.Text;
    atualiza.CpfCnpj = txtCpfCnpj.Text.Replace(".", "").Replace("-", "");
    atualiza.RgIe = txtRgIe.Text;
    atualiza.DtNacimento = Convert.ToDateTime(mtbDtNacimento.Text);
    atualiza.Pai = txtPai.Text;
    atualiza.Mae = txtMae.Text;

    ctx.SaveChanges();
    }
    else if (cbTipo.Text == "CNPJ")
    {
    atualiza.DTCadastro = Convert.ToDateTime(mtbDtCadastro.Text);
    atualiza.Tipo = cbTipo.Text;
    atualiza.SituacaoCliente = aux;
    atualiza.Nome = txtNome.Text;
    atualiza.Endereco = txtEndereco.Text;
    atualiza.Complemento = txtComplemento.Text;
    atualiza.Bairro = txtBairro.Text;
    atualiza.Cep = mtbCep.Text.Replace(".", "").Replace("-", "");
    atualiza.Cidade = txtCidade.Text;
    atualiza.Estado = txtUf.Text;
    atualiza.TelFixo = mtbTelFixo.Text.Replace("(", "").Replace(")", "").Replace("-", "");
    atualiza.TelCelular = mtbTelCelular.Text.Replace("(", "").Replace(")", "").Replace("-", "");
    atualiza.Email = txtEmail.Text;
    atualiza.CpfCnpj = txtCpfCnpj.Text.Replace(".", "").Replace("-", "");
    atualiza.RgIe = txtRgIe.Text;
    atualiza.NomeSocio = txtNomeSocio.Text;
    atualiza.CpfSocio = txtCpfSocio.Text.Replace(".", "").Replace("-", "");
    atualiza.RgSocio = txtRgSocio.Text;
    atualiza.Site = txtSite.Text;

    ctx.SaveChanges();
    };
    }
    MessageBox.Show("Dados alterados com sucesso!", "Aviso do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }


    void Gravar()
    {
    try
    {
    using (var ctx = new sigproEntities())
    {
    if (rbAtivo.Checked)
    {
    aux = "A";
    }
    if (rbInativo.Checked)
    {
    aux = "I";
    }

    if (cbTipo.Text == "CPF")
    {

    var CL = new cliente
    {
    Empresa_Id = 1, //(É o código da empresa na tabela empresa)
    DTCadastro = Convert.ToDateTime(mtbDtCadastro.Text),
    Tipo = cbTipo.Text,
    SituacaoCliente = aux,
    Nome = txtNome.Text,
    Endereco = txtEndereco.Text,
    Complemento = txtComplemento.Text,
    Bairro = txtBairro.Text,
    Cep = mtbCep.Text.Replace(".", "").Replace("-", ""),
    Cidade = txtCidade.Text,
    Estado = txtUf.Text,
    TelFixo = mtbTelFixo.Text.Replace("(", "").Replace(")", "").Replace("-", ""),
    TelCelular = mtbTelCelular.Text.Replace("(", "").Replace(")", "").Replace("-", ""),
    Email = txtEmail.Text,
    CpfCnpj = txtCpfCnpj.Text.Replace(".", "").Replace("-", ""),
    RgIe = txtRgIe.Text,
    DtNacimento = Convert.ToDateTime(mtbDtNacimento.Text),
    Pai = txtPai.Text,
    Mae = txtMae.Text,
    };
    ctx.cliente.Add(CL);
    ctx.SaveChanges();
    }
    else if (cbTipo.Text == "CNPJ")
    {
    var CL = new cliente
    {
    Empresa_Id = 1, //(É o código da empresa na tabela empresa)
    DTCadastro = Convert.ToDateTime(mtbDtCadastro.Text),
    Tipo = cbTipo.Text,
    SituacaoCliente = aux,
    Nome = txtNome.Text,
    Endereco = txtEndereco.Text,
    Complemento = txtComplemento.Text,
    Bairro = txtBairro.Text,
    Cep = mtbCep.Text.Replace(".", "").Replace("-", ""),
    Cidade = txtCidade.Text,
    Estado = txtUf.Text,
    TelFixo = mtbTelFixo.Text.Replace("(", "").Replace(")", "").Replace("-", ""),
    TelCelular = mtbTelCelular.Text.Replace("(", "").Replace(")", "").Replace("-", ""),
    Email = txtEmail.Text,
    CpfCnpj = txtCpfCnpj.Text.Replace(".", "").Replace("-", ""),
    RgIe = txtRgIe.Text,
    NomeSocio = txtNomeSocio.Text,
    CpfSocio = txtCpfSocio.Text.Replace(".", "").Replace("-", ""),
    RgSocio = txtRgSocio.Text,
    Site = txtSite.Text
    };
    ctx.cliente.Add(CL);
    ctx.SaveChanges();
    };
    }
    MessageBox.Show("Dados salvos com sucesso!", "Aviso do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }


    private void btnGravar_Click(object sender, EventArgs e)
    {
    try
    {
    if (txtCodigo.Text == null)
    {
    Gravar();
    btnPesquisar.Enabled = true;
    btnNovo.Enabled = true;
    btnGravar.Enabled = true;
    }
    else if (txtCodigo.Text == Cliente.Id.ToString()) // Aqui é onde aponta o erro.
    {
    Atualizar();
    btnPesquisar.Enabled = true;
    btnNovo.Enabled = true;
    btnGravar.Enabled = true;
    }
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }

    Consulta, busca e atualização funcionam perfeitamente, o problema é quando vou inserir um novo cliente e aponta o seguinte erro "Object reference not set to an instance of an object" e aponta um erro na linha
    "else if (txtCodigo.Text == Cliente.Id.ToString()) do metodo btnGravar_click estas linha deste metodo e apenas para chamar os metodos gravar() e atualizar(). Se eu deixar somente a linha onde chamo o metodo Gravar() funciona normal só que fazendo a verificação apresenta este erro.
    OBS: se eu tirar o relacionamento entre a tabela cliente e empresa e metodo funciona perfeitamente.
    quinta-feira, 11 de abril de 2013 22:47

Respostas

  • Samuel,

    Obrigado pela ajuda, agora deu certo, só que tive que alterar mais um detalhe no método click do botão salvar.

    Antes:
    if (txtCodigo.Text == null)

    Depois:

    if (txtCodigo.Text == "")

    Feito a alteração que vc me passou + a que eu fiz tudo funciona bem.

    sexta-feira, 12 de abril de 2013 13:04

Todas as Respostas

  • Cara,

    Esse problema de relacionamento não tem nada a ver com o problema do código. Provavelmente o seu Cliente.Id está voltando nulo e quando tenta converter com ToString() apresenta o erro. Para resolver o seu problema de conversão com valores nulos, utilize o Parse ou o Convert:

    else if (txtCodigo.Text == Convert.ToString(Cliente.Id)) 
    {
       Atualizar();
       btnPesquisar.Enabled = true;
       btnNovo.Enabled = true;
       btnGravar.Enabled = true;
    }

    Dessa forma quando converte para string não da erro se o valor voltar nulo. Porém para ter certeza da minha teoria, veja o valor da sua propriedade debugando o código se está retornando nulo realmente.


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 11 de abril de 2013 23:00
  • Olá Amigo!!!

    O Objeto Cliente está sendo instanciado em qual momento?

    Se o objeto Cliente ainda não foi instanciado, este erro realmente vai acontecer...

    Abraço!!!


    (Se a isto ajudou a resolver o problema, por favor, marque como resposta)

    sexta-feira, 12 de abril de 2013 01:21
  • Vou testar..


    sexta-feira, 12 de abril de 2013 12:43
  • Samuel,

    Obrigado pela ajuda, agora deu certo, só que tive que alterar mais um detalhe no método click do botão salvar.

    Antes:
    if (txtCodigo.Text == null)

    Depois:

    if (txtCodigo.Text == "")

    Feito a alteração que vc me passou + a que eu fiz tudo funciona bem.

    sexta-feira, 12 de abril de 2013 13:04