none
Erro na hora de alterar registro RRS feed

  • Pergunta

  • Estou usando LINQ num projeto windows form. Tenho uma tabela chamada "entidade". Nessa tabela tem o id da cidade. Cidade é ligada com a tabela Estados. Quando eu salvo uma nova entidade, salva corretamente, porém se eu alterar uma entidade, ele não deixa mudar o id da cidade:
    entidade upEntidade = dc.entidades.Single(t => t.identidade == objEntidade.identidade); 
    Nessa linha eu puxo o registro para altera-lo....
    o erro dá nessa linha:
    upEntidade.idcidade = objEntidade.idcidade; 

    "Operation is not valid due to the current state of the object."




    sexta-feira, 20 de fevereiro de 2009 14:44

Respostas

  • deve ser pq o idcidade eh um relacionamento... o certo eh vc setar a Cidade e nao o codigo em si.... algo como

    var idcidade = ((cidade)cboCidade.SelectedItem).idcidade; 
    objEntidade.Cidade = dc.cidades.SingleOrDefault(c => c.idcidade == idcidade); 
    • Editado Rui SantosModerator sexta-feira, 20 de fevereiro de 2009 23:54 correcao
    • Marcado como Resposta JobaDiniz domingo, 22 de fevereiro de 2009 03:14
    sexta-feira, 20 de fevereiro de 2009 23:52
    Moderador

Todas as Respostas

  • Coloca o bloco inteiro do código
    http://blog.fujiy.net/ - MCTS em .Net 2.0
    sexta-feira, 20 de fevereiro de 2009 16:26
  • Vamos lá então:
    Há um DataGridView com os registros. Quando o cara clicar duas vezes em uma linha eu executo o seguinte código:
    protected override void dgvDados_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 
            { 
                base.dgvDados_CellDoubleClick(sender, e); 
                if (dgvDados.Rows.Count > 0) 
                { 
                    objCredore = dc.credores.Single(t => t.idcredor == Convert.ToInt64(dgvDados.CurrentRow.Cells[0].Value)); 
                    objEntidade = dc.entidades.Single(t => t.identidade == objCredore.identidade); 
                    dgvDados.CurrentRow.Selected = true
                    PreencheFormulario(); 
                    tbcAbas.SelectedTab = tabDetalhes; 
                } 
            } 
    Em que o método "PreencheFormulario()" pega os dados dos objetos (objCredore,objEntidade) e coloca nos devidos campos. Quando o cara clicar em Salvar, eu chamo o método "PreencheObjeto()" que faz o contrário do "PreencheFormulario()":
    private void PreencheObjeto() 
            { 
                objEntidade.logradouro = txtLogradouro.Text; 
                objEntidade.bairro = txtBairro.Text; 
                objEntidade.numero = Convert.ToInt32(txtNumero.Text); 
                objEntidade.cep = mtxtCEP.Text; 
                objEntidade.complemento = txtComplemento.Text;            
                objEntidade.idcidade = ((cidade)cboCidade.SelectedItem).idcidade; 
                //... 
     Já nessa linha "objEntidade.idcidade = ..." dá o erro que falei. Esse "objEntidade" é aquele que eu puxo quando o cara dá os 2 cliques na linha do DataGridView. Ele já está preenchido, eu estou preenchendo novamente com as modificações, e ele não deixa "sobreescrever" o idcidade.
    sexta-feira, 20 de fevereiro de 2009 17:23
  • Eu não costumo usar assim. Pelo que vi você usa o DataContext como variavel global?


    Eu uso assim:


    using(DataContext db = .....)

    {

    var entidade = from.....


    entidade.id = ...


    db.SaveChanges();


    }


    http://blog.fujiy.net/ - MCTS em .Net 2.0
    sexta-feira, 20 de fevereiro de 2009 17:42
  • Não, não é isso.
    sexta-feira, 20 de fevereiro de 2009 18:40
  • deve ser pq o idcidade eh um relacionamento... o certo eh vc setar a Cidade e nao o codigo em si.... algo como

    var idcidade = ((cidade)cboCidade.SelectedItem).idcidade; 
    objEntidade.Cidade = dc.cidades.SingleOrDefault(c => c.idcidade == idcidade); 
    • Editado Rui SantosModerator sexta-feira, 20 de fevereiro de 2009 23:54 correcao
    • Marcado como Resposta JobaDiniz domingo, 22 de fevereiro de 2009 03:14
    sexta-feira, 20 de fevereiro de 2009 23:52
    Moderador
  • Mas a tabela Entidades não possui "Cidade", apenas o idcidade que é chave estrangeira.
    objEntidade.Cidade não existe.

    Tenho Estados que passa chave para Cidades que passa chave para Entidades. E eu nem mudo o estado do cara, só mudo a cidade, ou seja, a cidade pertence ao mesmo estado, e mesmo assim dá erro.

    EDIT: Meu erro, existe Cidade sim, e parece que deu certo. Vlw.
    domingo, 22 de fevereiro de 2009 02:49
  • kkk ok.... eh que o Linq cria automaticamente as propriedades para os relacionamentos... esqueci de explicar isso ;)
    domingo, 22 de fevereiro de 2009 22:27
    Moderador
  • Bom dia!

    Estou com o mesmo problema do JOBADINIZ, o que ele fez para solucionar?

    sds

     

    obs: ao tentar atribuir o valor ao IDFORNECEDOR ele joga o erro

     var dadosAlt = from p in db.VEICULOs 
                                 where p.IDVEICULO  == Convert.ToInt16(txtIDVeiculo)
                                 select p;

     VEICULO undid = db.VEICULOs.First(p => p.IDVEICULO == Convert.ToInt16(txtIDVeiculo.Text));

                        if (undid != null)
                        {
                            undid.PLACAVEICULO  = txtPlaca.Text;
                            undid.IDFORNECEDOR = (cboFornecedor.SelectedValue).ToString().Trim();
                                     
                            db.SubmitChanges();
                          }

     

    quinta-feira, 7 de abril de 2011 14:18