none
Atualização duas tabelas entity framework RRS feed

  • Pergunta

  • Olá, não sei se estou no fórum correto, mas aí vai minha dúvida. Sou iniciante no desenvolvimento em mvc e no entity framework. Eu tenho o seguinte código: 

      public ActionResult Create(SINCO_CONCESSAO sinco_concessao, SINCO_LOCALIDADE_CONCESSAO sinco_localidade_concessao)
            {
                if (ModelState.IsValid)
                {
                    db.SINCO_CONCESSAO.Add(sinco_concessao);
                    db.SaveChanges();
                    
                   sinco_localidade_concessao.IDCONCESSAO = sinco_concessao.IDCONCESSAO;
    
                    db.SINCO_LOCALIDADE_CONCESSAO.Add(sinco_localidade_concessao);
                    db.SaveChanges();

    O que eu preciso fazer é o seguinte: fazer uma inserção na tabela sinco_concessao, sendo que essa tabela possui uma chave primária, idconcessao, que é incrementada automaticamente pelo banco.

    Depois tenho que fazer uma inserção na tabela sinco_localidade_concessao, que tem uma chave estrangeira idconcessao, ou seja, ela precisa da informação do idconcessao para poder fazer a inserção com sucesso.

    O que ocorre é que depois que eu salvo as alterações da tabela sinco_concessao, eu preciso de pegar o valor do idconcessao atualizado, mas não estou conseguindo fazer isso, pois o valor idconcessao fica zerado e dá erro de chave. O que poderia ser feito neste caso?

    sexta-feira, 5 de dezembro de 2014 12:56

Todas as Respostas

  • Oi Jéssica,

    Eu estou supondo que existe uma propriedade SINCO_LOCALIDADE_CONCESSAO na classe SINCO_CONCESSAO.

    Experimenta fazer o seguinte:

    sinco_concessao.SINCO_LOCALIDADE_CONCESSAO = sinco_localidade_concessao;

    db.SINCO_CONCESSAO.Add(sinco_concessao); db.SaveChanges();

    O código fica mais simples e o trabalho pesado fica com o Entity Framework.

    Qual banco vc está usando?

    sexta-feira, 5 de dezembro de 2014 17:36
  • Obrigada pela resposta Achilles, 

    eu estou usando o banco oracle. 

    Eu fiz essa alteração que você me sugeriu, porém o problema é que a minha propriedade SINCO_LOCALIDADE_CONCESSAO pega os dados de uma listbox, dessa forma está declarado como:

     public virtual ICollection<SINCO_LOCALIDADE_CONCESSAO> SINCO_LOCALIDADE_CONCESSAO { get; set; }


    Então quando eu fiz a alteração deu erro de conversão:

    Erro 2 Não é possível converter implicitamente o tipo 'SINCO_MVC.Models.SINCO_LOCALIDADE_CONCESSAO' em 'System.Collections.Generic.ICollection<SINCO_MVC.Models.SINCO_LOCALIDADE_CONCESSAO>'. Existe uma conversão explícita. Precisa de cast?

    Não vejo como fazer essa conversão. Alguma sugestão?

    sexta-feira, 5 de dezembro de 2014 20:06
  • Boa noite Jéssica,

    pelo que entendi você está querendo apenas referenciar o Id da tabela Pai (sinco_concessao) na foreign key da tabela filho (sinco_localidade_concessao).

    O Entity Framework já faz isso para você se você tiver feito os mapeamentos das entidades corretamente.

    No seu código, basta retirar o primeiro SaveChanges() e deixar somente o SaveChanges() no final do método, isso irá fazer com que você manipule todos os dados das entidades em memória e a hora que você der o SaveChanges() final o EntityFramework irá salvar os dados da tabela Pai e colocar o respectivo ID gerado na tabela filho.

    Seu código ficaria assim:

    public ActionResult Create(SINCO_CONCESSAO sinco_concessao, SINCO_LOCALIDADE_CONCESSAO sinco_localidade_concessao)
            {
                if (ModelState.IsValid)
                {
                    db.SINCO_CONCESSAO.Add(sinco_concessao);
                    
                    sinco_localidade_concessao.IDCONCESSAO = sinco_concessao.IDCONCESSAO;
    
                    db.SINCO_LOCALIDADE_CONCESSAO.Add(sinco_localidade_concessao);
                    db.SaveChanges(); //Esse método irá resolver tudo para você
    
                }
            }
    

    Espero ter ajudado.

    Abraços!

    >> (Se minha resposta foi útil para você, marque como Útil).

    sexta-feira, 5 de dezembro de 2014 22:58
  • Olá Murilo, obrigada pela resposta. Eu fiz isso que você falou, deixei o código exatamente dessa forma que você sugeriu, mas ainda estou com o mesmo errro:

    "ORA-02291: integrity constraint (SINCO.FK_SINCO_CONCESSAO2) violated - parent key not found"

    Acredito que os mapeamentos estejam corretos, veja aonde eu faço a associação:

        <AssociationSet Name="FK_SINCO_CONCESSAO2" Association="Model.Store.FK_SINCO_CONCESSAO2">
                <End Role="SINCO_CONCESSAO" EntitySet="SINCO_CONCESSAO" />
                <End Role="SINCO_LOCALIDADE_CONCESSAO" EntitySet="SINCO_LOCALIDADE_CONCESSAO" />
              </AssociationSet>


    • Editado Jéssica_Lau quinta-feira, 11 de dezembro de 2014 17:52
    quinta-feira, 11 de dezembro de 2014 17:51