none
Salvar dados tabela relacionada com Entity framework (WebForms) RRS feed

  • Pergunta

  • Olá, estou com dificuldade em salvar dados no meu banco que tem tabelas relacionadas.

    Está dando esse erro no momento que vai salvar: System.InvalidOperationException: 'An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

    A minha aplicação, é um sistema de cadastro de Fatura (básico), pois estou iniciando. Nela eu tenho o formulário de cadastro de fatura que está desse jeito:


    Código da GridV Selecionar Telefone (botão adicionar):
     private void btnadicionartelefone_Click(object sender, EventArgs e)

            {


                using (SIGTELEntities dados = new SIGTELEntities())
                {




                    int idTelefone = int.Parse(cbtelfatura.SelectedValue.ToString());
                    // Buscando obj do telefone no banco
                    var objTelefone = dados.Telefones.Where(c => c.ID_Telefone == idTelefone).FirstOrDefault();


                    if (txtvalorcelular.Text == "")
                    {
                        MessageBox.Show("O campo valor está vazio");
                        txtvalorcelular.Focus();
                        return;
                                           
                    }

                    TelefoneFatura obj = new TelefoneFatura();
                    obj.ID_Telefone = objTelefone.ID_Telefone;
                    obj.Valor = int.Parse(txtvalorcelular.Text);
                    obj.Telefones = objTelefone;
                    lstTelefoneFatura.Add(obj);
                    AtualizaGridTelefone();    //chama o metodo atualiza GridTelefone abaixo "private void AtualizaGridTelefone()"
                    txtvalorcelular.Clear();   //Limpa o campo celular
                    txtvalorcelular.Focus();   //Apaga ao valor inserir e leva o digitar para lá


                }

            }

    Código da GridV Servicços da Fatura (botão adicionar):
    private void btnaddservicofatura_Click(object sender, EventArgs e)
            {
                SIGTELEntities dados = new SIGTELEntities();

                //validação de campo valor do serviço VAZIO
                if (txtvalorservicofatura.Text == "")
                {
                    MessageBox.Show("O campo valor está vazio");
                    txtvalorservicofatura.Focus();
                    return;

                }

                // área de busca no banco de dados.
                int idServico = int.Parse(cbservicosfatura.SelectedValue.ToString());
                int TelExtra = int.Parse(cbtelefonefaturaextra.SelectedValue.ToString());
                
                    
                Servicos objServico = dados.Servicos.Where(c => c.ID_Servico == idServico).FirstOrDefault();

                FaturaServico obj = new FaturaServico();
                obj.ID_Servico = idServico;
                obj.Servicos = objServico;
                obj.ID_Telefone = TelExtra;
                obj.ValorServico = int.Parse(txtvalorservicofatura.Text);

                lstFaturaService.Add(obj);
                AtualizaGridServico();

                txtvalorservicofatura.Clear(); //Limpa o campo serviço
                txtvalorservicofatura.Focus(); //Apag ao valor inserir e leva o digitar para lá

            }
            private void AtualizaGridServico()
            {
               gvlistaservico.DataSource = null;
               gvlistaservico.DataSource = lstFaturaService.Select(c => new
                {
                    NomeServico = c.Servicos.NomeServico,
                    ValorServico = c.ValorServico

                }).ToList();
                
            }

    Os códigos acima estão funcionando. Basicamente no inicio do código eu crio uma Lista vazia e adiciono os dados que contém em uma fatura ( Telefones e Serviços )

    O erro está nessa área, quando vou salvar:

            private void btnsalvarfatura_Click(object sender, EventArgs e) //Botão que faz o envio para o banco de dados de todos os iténs coletados no formulário.
            {
                var ValidarNumFatura = txtnumerofatura;
                using (SIGTELEntities dados = new SIGTELEntities())
                {
                    //ÁREA DE VALIDAÇÃO DE CAMPOS VAZIOS
                    var objvalidanumfatura = dados.Fatura.Where(p => p.NumeroFatura == ValidarNumFatura.Text).FirstOrDefault();
                    if (objvalidanumfatura != null)
                    {
                        MessageBox.Show("Este número de Fatura já contém na base de dados");
                        return;
                    }
                    codgerais f = new codgerais();
                    if (f.CampoVazio(txtnumerofatura, "Número da fatura", errorProvider1) == true)
                        return;
                    if (f.CampoVazio(txtviafatura, " Via da fatura", errorProvider1) == true)
                        return;
                    if (f.CampoVazio(txtvalorfatura, " Valor da fatura", errorProvider1) == true)
                        return;
                    // if (f.CampoVazio(cbtelefonefaturaextra, "Telefone especifcio", errorProvider1) == true)
                    // return;
                    // if (f.CampoVazio(txtvalorcelular," Valor do Celular", errorProvider1) == true)
                    // return;
                    //if (f.CampoVazio(txtvalorservicofatura," Valor do Serviço", errorProvider1) == true)
                    //return;

                    //VERIFICA SE O GRIDVIEW DE TELEFONE E SEVIÇO ESTÁ VAZIO
                    if (lstTelefoneFatura.Count == 0)
                    {
                        MessageBox.Show("A fatura deve conter ao menos 1 número de celular");
                        return;
                    }
                    if (lstFaturaService.Count == 0)
                    {
                        MessageBox.Show("A fatura deve conter ao menos 1 serviço");
                        return;
                    }
                    //SALVA OS VALORES NO BANCO
                    Fatura obj = new Fatura();  // Cria um objeto da Tabela fatura

                                   
                    obj.NumeroFatura = txtnumerofatura.Text;
                    obj.NumeroConta = int.Parse(cbnumcontafatura.Text);
                    obj.NumeroCliente = int.Parse(txtnumerocliente.Text);
                    obj.DataInicio = Convert.ToDateTime(dtinicio.Value);
                    obj.DataFim = Convert.ToDateTime(dtfinalfatura.Value);
                    obj.ViaFatura = int.Parse(txtviafatura.Text);
                    obj.Vencimento = Convert.ToDateTime(dtvencimentofatura.Value);

                    obj.CNPJ = txtcnpjfatura.Text;

                    obj.ValorFatura = int.Parse(txtvalorfatura.Text);
                    obj.ID_Unidade = (int)cbunidadefatura.SelectedValue;

                    //PERCORRE A LIsTA DAS GRIDVIEWS Telefone e Serviços fatura E SALVA OS VALORES NO BANCO         
                    foreach (var objTelefoneFatura in lstTelefoneFatura)
                        obj.TelefoneFatura.Add(objTelefoneFatura);

                    foreach (var objFaturaServico in lstFaturaService)
                        obj.FaturaServico.Add(objFaturaServico);


                    dados.Fatura.Add(obj);
                    dados.SaveChanges();

    terça-feira, 14 de janeiro de 2020 14:04