none
Alterar com Entity Framework RRS feed

  • Pergunta

  • Boa noite.

    Pessoal, estou tentando fazer a função de alterar dentro do sistema com entity framework,

    porém não está alterando. Vezes duplica os cadastros e outras vezes não ocorre nada, dependendo 

    do que faço.

    Se eu deixar desta maneira:

        contexto.AddToBiomedicos(CarregaBiomedico);
                        contexto.AddToAcessando(CarregaAcessando);
                        contexto.SaveChanges();
                        contexto.SaveChanges();

    Ele duplicará o cadastro. (Clicando em salvar irá salvar a pessoa em outro código com as mesmas informações. Só com o SaveChanges, sem o addToBiomedicos, não faz nada.) Não sei o que faço mais. A parte de alteração fiz desta forma:

          MessageBox.Show("Deseja sobrepor informações cadastradas?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information);


                        contexto.AddToBiomedicos(CarregaBiomedico);
                        contexto.Refresh(RefreshMode.StoreWins, contexto.Biomedicos);
                        var Carregamento = contexto.Biomedicos.ToList();

                        contexto.SaveChanges();
                        MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);

    Não está funcionando também.

    Alguém pode me ajudar por favor???

    Sou iniciante em C# e entrego meu TCC semana que vem em C#.

    Só falta isso pra completar basicamente!

    Desde já agradeço pessoal.

    sexta-feira, 1 de junho de 2012 01:10

Respostas

  • Olá Luana,

    Tudo bem com vc?

    Que bom que entrega seu TCC na próxima semana :)
    Qual curso?

    Pois bem, para atualizarmos dados com o Entity Framework precisamos apenas attachar o objeto ao nosso banco de dados e modificar seu status para Modified.

    Abaixo escrevi um código se um possível Grupo, onde o adiciono, depois faço uma pequena alteração em uma de suas propriedades, e depois o atualizo na base de dados. Vamos ver se isto ajuda. Se não for suficiente poste outras partes do seu código para entendermos como esta funcionando. Ok?

        Grupo novoGrupo = new Grupo();
        novoGrupo.Id = 0;
        novoGrupo.Nome = "Meu novo grupo";
    
        // Bloco para inclusão de um grupo
        using (dbProdutosEntities contexto = new dbProdutosEntities())
        {
            contexto.AddToGrupo(novoGrupo);
    
            contexto.SaveChanges();
        }
    
        // O código abaixo simulad que algum dado foi alterado
        novoGrupo.Nome = "Meu grupo atualizado :)";
    
        // Bloco para atualização de um grupo
        using (dbProdutosEntities contexto = new dbProdutosEntities())
        {
            contexto.Attach(novoGrupo);
            contexto.ObjectStateManager.ChangeObjectState(novoGrupo, System.Data.EntityState.Modified);
    
            contexto.SaveChanges();
        }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 02:24
    Moderador
  • Oi Luana,

    Parabéns! Que esta seja uma de muitas vitórias.

    Para corrigir este problema faça assim:

     using(ContextoContainer contextobm = new ContextoContainer())
    
    {
    int codigoBiomedico = Convert.ToInt32(tCodigoBM.Text);      
    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == codigoBiomedico);
    
    contextobm.Attach(CarregaBiomedico);
    
    contextobm.ObjectStateManager.ChangeObjectState(CarregaBiomedico, System.Data.EntityState.Modified);
    
    contextobm.SaveChanges();
    
    MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    Só fiquei em dúvida com uma coisa: pq essa consulta ai no meio?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 23:55
    Moderador
  • Oi Luana,

    Dei uma pesquisada rápida e achei duas soluções para este problema:

    A primeira solução é substituir a linha do Attah por isto:

    contextobm.AttachTo("Biomedicos", CarregaBiomedico);
    
    

    e a segunda é substituir a linha do Attach e do ChangeObjectState por uma única linha, no caso esta:

    contextobm.Biomedicos.AttachAsModified(CarregaBiomedico); 

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sábado, 2 de junho de 2012 01:27
    Moderador
  • Oi Luana,

    Neste caso então podemos atribuir a propriedade IDBiomedico o valor da variável codigoBiomedico?

    Desta forma:

    CarregaBiomedico.IDBiomedico = codigoBiomedico;

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique


    sábado, 2 de junho de 2012 15:01
    Moderador
  • Se você usar o AddToBiomedicos, então sempre será adicionado um novo após o SaveChanges..

    Para alterar você deve buscar o registro do banco pelo id, alterar as propriedades e depois usar o SaveChanges.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 01:14

Todas as Respostas

  • Se você usar o AddToBiomedicos, então sempre será adicionado um novo após o SaveChanges..

    Para alterar você deve buscar o registro do banco pelo id, alterar as propriedades e depois usar o SaveChanges.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 01:14
  • Olá Luana,

    Tudo bem com vc?

    Que bom que entrega seu TCC na próxima semana :)
    Qual curso?

    Pois bem, para atualizarmos dados com o Entity Framework precisamos apenas attachar o objeto ao nosso banco de dados e modificar seu status para Modified.

    Abaixo escrevi um código se um possível Grupo, onde o adiciono, depois faço uma pequena alteração em uma de suas propriedades, e depois o atualizo na base de dados. Vamos ver se isto ajuda. Se não for suficiente poste outras partes do seu código para entendermos como esta funcionando. Ok?

        Grupo novoGrupo = new Grupo();
        novoGrupo.Id = 0;
        novoGrupo.Nome = "Meu novo grupo";
    
        // Bloco para inclusão de um grupo
        using (dbProdutosEntities contexto = new dbProdutosEntities())
        {
            contexto.AddToGrupo(novoGrupo);
    
            contexto.SaveChanges();
        }
    
        // O código abaixo simulad que algum dado foi alterado
        novoGrupo.Nome = "Meu grupo atualizado :)";
    
        // Bloco para atualização de um grupo
        using (dbProdutosEntities contexto = new dbProdutosEntities())
        {
            contexto.Attach(novoGrupo);
            contexto.ObjectStateManager.ChangeObjectState(novoGrupo, System.Data.EntityState.Modified);
    
            contexto.SaveChanges();
        }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 02:24
    Moderador
  • Boa noitee...

    Tudo bem pessoal?

    Então, estou me formando em Análise e Desenvolvimento de Sistemas...

    Enfim, fiz essa parte que vc me passou Fernando, porém, aparece um erro ao Alterar...

    O código está dessa forma:

     using(ContextoContainer contextobm = new ContextoContainer())
    
    {
                       
    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == Convert.ToInt32(tCodigoBM.Text));
    
    contextobm.Attach(CarregaBiomedico);
    
    contextobm.ObjectStateManager.ChangeObjectState(CarregaBiomedico, System.Data.EntityState.Modified);
    
    contextobm.SaveChanges();
    
    MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    O erro que ocorre é na linha 

    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == Convert.ToInt32(tCodigoBM.Text));

    Mensagem do erro: "LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression."

    Acredito que seja porque a sintaxe está incorreta, porém se deixo somente:

    var BM = contexto.Biomedicos.First(id => id.IDBiomedico);

    Ele também não aceita.

    Agradeço a ajuda de vocês pessoal!

    sexta-feira, 1 de junho de 2012 23:26
  • Oi Luana,

    Parabéns! Que esta seja uma de muitas vitórias.

    Para corrigir este problema faça assim:

     using(ContextoContainer contextobm = new ContextoContainer())
    
    {
    int codigoBiomedico = Convert.ToInt32(tCodigoBM.Text);      
    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == codigoBiomedico);
    
    contextobm.Attach(CarregaBiomedico);
    
    contextobm.ObjectStateManager.ChangeObjectState(CarregaBiomedico, System.Data.EntityState.Modified);
    
    contextobm.SaveChanges();
    
    MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    Só fiquei em dúvida com uma coisa: pq essa consulta ai no meio?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sexta-feira, 1 de junho de 2012 23:55
    Moderador
  • Vou colocar o código todo pra que vocês entendam melhor. 

    Eis o código do botão Salvar.

            private void btnSalvar_Click(object sender, EventArgs e)
            {
    Biomedico CarregaBiomedico = new Biomedico();
    Acessando CarregaAcessando = new Acessando();
    
    var contexto = new ContextoContainer();
    
    var x = contexto.Biomedicos.Where(f => f.CPFBiomedico == mtbCPFBM.Text).FirstOrDefault();
    var y = contexto.Biomedicos.Where(g => g.RGBiomedico == mtbRGBM.Text).FirstOrDefault();
    var ID = contexto.Biomedicos.Where(id => id.IDBiomedico == Convert.ToInt32(tCodigoBM.Text));
    var cpf = ValidaCPF.ValidacaoCPF(mtbCPFBM.Text) == true;
    
    
    if (x == null || y == null || ID == null)
    {
    if (cpf)
    {
    MessageBox.Show("CPF Inválido! Por favor verifique!");
    }
    else
    {
    if (x != null)
    {
    MessageBox.Show("CPF já cadastrado!\nInformações não serão salvas!","",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
    if (y != null)
    {
    MessageBox.Show("RG já cadastrado!\nInformações não serão salvas!","",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
    }
    
    if (x == null || y == null || ID == null)
    
    CarregaBiomedico.CRBMBiomedico = tCRBM.Text;
    CarregaBiomedico.NomeBiomedico = tNomeBM.Text;
    CarregaBiomedico.LogradouroBiomedico = tLogradouroBM.Text;
    CarregaBiomedico.NumEndBiomedico = Convert.ToInt32(tNumBM.Text); 
    CarregaBiomedico.ComplementoBiomedico = tComplementoBM.Text;
    CarregaBiomedico.BairroBiomedico = tBairroBM.Text;
    CarregaBiomedico.CEPBiomedico = mtbCEPBM.Text;
    CarregaBiomedico.CidadeBiomedico = tCidadeBM.Text;
    CarregaBiomedico.EstadoBiomedico = cEstadoBM.Text;
    CarregaBiomedico.SexoBiomedico = cSexoBM.Text;
    CarregaBiomedico.CPFBiomedico = mtbCPFBM.Text;
    CarregaBiomedico.RGBiomedico = mtbRGBM.Text;
    CarregaBiomedico.TelResBiomedico = mtbTelResBM.Text;
    CarregaBiomedico.TelCelBiomedico = mtbTelCelBM.Text;
    CarregaAcessando.UsuarioAcesso = tbLoginCadBM.Text;
    CarregaAcessando.SenhaAcesso = tbSenhaCadBM.Text;
    CarregaBiomedico.ObservacoesBiomedico = tObservacoesBM.Text;
    CarregaBiomedico.DataNascBiomedico = mtbDataNascimentoBM.Text;
    
    contexto.AddToBiomedicos(CarregaBiomedico);
    contexto.AddToAcessando(CarregaAcessando);
    contexto.SaveChanges();
    contexto.SaveChanges();
    
    MessageBox.Show("Dados salvos com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    else if (ID != null)
    {
    MessageBox.Show("Deseja sobrepor informações cadastradas?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
    
    CarregaBiomedico.CRBMBiomedico = tCRBM.Text;
    CarregaBiomedico.NomeBiomedico = tNomeBM.Text;
    CarregaBiomedico.LogradouroBiomedico = tLogradouroBM.Text;
    CarregaBiomedico.NumEndBiomedico = Convert.ToInt32(tNumBM.Text); 
    CarregaBiomedico.ComplementoBiomedico = tComplementoBM.Text;
    CarregaBiomedico.BairroBiomedico = tBairroBM.Text;
    CarregaBiomedico.CEPBiomedico = mtbCEPBM.Text;
    CarregaBiomedico.CidadeBiomedico = tCidadeBM.Text;
    CarregaBiomedico.EstadoBiomedico = cEstadoBM.Text;
    CarregaBiomedico.SexoBiomedico = cSexoBM.Text;
    CarregaBiomedico.CPFBiomedico = mtbCPFBM.Text;
    CarregaBiomedico.RGBiomedico = mtbRGBM.Text;
    CarregaBiomedico.TelResBiomedico = mtbTelResBM.Text;
    CarregaBiomedico.TelCelBiomedico = mtbTelCelBM.Text;
    CarregaAcessando.UsuarioAcesso = tbLoginCadBM.Text;
    CarregaAcessando.SenhaAcesso = tbSenhaCadBM.Text;
    CarregaBiomedico.ObservacoesBiomedico = tObservacoesBM.Text;
    CarregaBiomedico.DataNascBiomedico = mtbDataNascimentoBM.Text;
    
    using(ContextoContainer contextobm = new ContextoContainer())
    {
    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == Convert.ToInt32(tCodigoBM.Text));
    
    contextobm.Attach(CarregaBiomedico);
                        contextobm.ObjectStateManager.ChangeObjectState(CarregaBiomedico, System.Data.EntityState.Modified);
    
    contextobm.SaveChanges();
    
    MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }

    Obrigada desde já!

    sábado, 2 de junho de 2012 00:03
  • Obrigada!!!

    Essa consulta? É pra validar se o CPF ou RG já existem no banco.

    Fernando, deu outro erro...rsrsrs...

    Erro: "An object with a null EntityKey value cannot be attached to an object context."

    Agora nessa linha:

    contextobm.Attach(CarregaBiomedico);

    Tem noção do que seja?

    sábado, 2 de junho de 2012 00:47
  • Olá Luana,

    Dei uma olhada no seu código e achei o problema.

    Em nenhum momento vc atribui o IDBiomedico para a instância CarregaBiomedico.

    Na linha acima do comando Attach vc deve fazer essa atribuição.

    Seu código deve ficar assim:

    CarregaBiomedico.IDBiomedico = ID.IDBiomedico;
    contextobm.Attach(CarregaBiomedico);
    

    Outro detalhe que percebi: quando vc vai incluir um Biomedico vc chama duas vezes o método SaveChanges.

    Chame apenas uma vez que já suficiente.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 2 de junho de 2012 01:02
    Moderador
  • Ainda assim está dando o erro...

    O mesmo erro na mesma linha.

    Fiz assim:

    CarregaBiomedico.IDBiomedico = codigoBiomedico;
    contextobm.Attach(CarregaBiomedico);

    Com ID.Biomedico dá erro...ele não reconhece o ID...

    sábado, 2 de junho de 2012 01:16
  • Oi Luana,

    Dei uma pesquisada rápida e achei duas soluções para este problema:

    A primeira solução é substituir a linha do Attah por isto:

    contextobm.AttachTo("Biomedicos", CarregaBiomedico);
    
    

    e a segunda é substituir a linha do Attach e do ChangeObjectState por uma única linha, no caso esta:

    contextobm.Biomedicos.AttachAsModified(CarregaBiomedico); 

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Marcado como Resposta Luana Roberta sábado, 2 de junho de 2012 01:43
    sábado, 2 de junho de 2012 01:27
    Moderador
  • Erro mudou...Acho que vou pirar com esse código...rsrsrsrsrs...

    "Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries."

    Agora no contexto.SaveChanges();

    sábado, 2 de junho de 2012 01:32
  • Oi Luana!

    Como esta o seu bloco de código agora?

    Quando vc coloca um breakpoint no código que valor é associado ao ID do Biomedico?

    Pela mensagem de erro, parece que o registro não existe na base de dados ainda, por isso ele não pode ser atualizado.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 2 de junho de 2012 03:23
    Moderador
  • O código está assim:

    else if (ID != null)
    {
    MessageBox.Show("Deseja sobrepor informações cadastradas?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
    
    using (ContextoContainer contextobm = new ContextoContainer())
    {
    
    CarregaBiomedico.CRBMBiomedico = tCRBM.Text;
    CarregaBiomedico.NomeBiomedico = tNomeBM.Text;
    CarregaBiomedico.LogradouroBiomedico = tLogradouroBM.Text;
    CarregaBiomedico.NumEndBiomedico = Convert.ToInt32(tNumBM.Text);
    CarregaBiomedico.ComplementoBiomedico = tComplementoBM.Text;
    CarregaBiomedico.BairroBiomedico = tBairroBM.Text;
    CarregaBiomedico.CEPBiomedico = mtbCEPBM.Text;
    CarregaBiomedico.CidadeBiomedico = tCidadeBM.Text;
    CarregaBiomedico.EstadoBiomedico = cEstadoBM.Text;
    CarregaBiomedico.SexoBiomedico = cSexoBM.Text;
    CarregaBiomedico.CPFBiomedico = mtbCPFBM.Text;
    CarregaBiomedico.RGBiomedico = mtbRG.Text;
    CarregaBiomedico.TelResBiomedico = mtbTelResBM.Text;
    CarregaBiomedico.TelCelBiomedico = mtbTelCelBM.Text;
    CarregaAcessando.UsuarioAcesso = tbLoginCadBM.Text;
    CarregaAcessando.SenhaAcesso = tbSenhaCadBM.Text;
    CarregaBiomedico.ObservacoesBiomedico = tObservacoesBM.Text;
    CarregaBiomedico.DataNascBiomedico = mtbDataNascimentoBM.Text;
    
    int codigoBiomedico = Convert.ToInt32(tCodigoBM.Text);
    var BM = contexto.Biomedicos.First(id => id.IDBiomedico == codigoBiomedico);
    
    contextobm.AttachTo("Biomedicos", CarregaBiomedico);
    
    contextobm.ObjectStateManager.ChangeObjectState(CarregaBiomedico, System.Data.EntityState.Modified);
    
    contextobm.SaveChanges();
    
    MessageBox.Show("Dados alterados com sucesso!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);

    Com o breakpoint, não traz nada.

    Veja:

    Não sei mais o que eu faço, faz uma semana que estou nesse código! =(

    sábado, 2 de junho de 2012 05:59
  • Oi Luana,

    Qual o ID que esta sendo passado para a variável codigoBiomedico?

    Vc poderia colocar a linha "CarregaBiomedico.IDBiomedico = ID.IDBiomedico;" acima do método AttachTo?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 2 de junho de 2012 13:37
    Moderador
  • Bom dia...

    Nesse codigoBiomedico eu estaria passando o valor to texbox onde está o código do Biomédico.

    Se eu tentar colocar CarregaBiomedico.IDBiomedico = ID.IDBiomedico ele não reconhece pois a variavel ID 

    não existe no código.

    IDBiomedico é a descrição do código no banco de dados. 

    sábado, 2 de junho de 2012 14:59
  • Oi Luana,

    Neste caso então podemos atribuir a propriedade IDBiomedico o valor da variável codigoBiomedico?

    Desta forma:

    CarregaBiomedico.IDBiomedico = codigoBiomedico;

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique


    sábado, 2 de junho de 2012 15:01
    Moderador
  • Aeeeeeeeeeeee...Deu certo Fernando...

    Nossa, muito obrigada pela paciência....rsrsrsrs...

    Deus te abençõe mto...

    Eu não sabia mais o que fazer...Valew mesmooo!

    Votarei como resposta e resposta útil! XD

    sábado, 2 de junho de 2012 15:15
  • Aeee Lu!

    Quando for assim não precisa esperar uma semana para resolver o problema.

    Se dedique algumas horas, de uma pesquisada por alguma solução (tente utilizar termos em inglês) e se estiver difícil venha até o fórum do MSDN.

    Temos muita gente bacana e disposta a ajudar, trabalhando quase que 24x7 :)

    O que precisar é só falar! ;)

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    sábado, 2 de junho de 2012 15:19
    Moderador