none
Da pra fazer undo do contexto do Entity RRS feed

  • Pergunta

  • Galera boa tarde.

    A pergunta principal é: Da pra fazer undo do contexto do Entity?

    Agora o porquê....

    Seguinte.. estou trabalhando com um aplicação MVC 3 com acesso a dados via Entity Framework Code first... Tudo bem até o momento porém me deparei com a seguinte situação: estou criando um contexto do Entity a cada request (aplicatio_beginRequest - Global.asax)... e a todo momento que se faz necessário acesso a dados utilizo o mesmo contexto dentro do request. Ocorre que: ao criar a minha unidade de trabalho (na camada de aplicaçao) para "transacionar" as minhas regras de negócio... se me ocorre um erro e alguma alteração foi realizada no contexto (antes do erro) esta alteração permanece no mesmo! E todos os meus erros são logados em banco... então "metade" das minhas regras de negocio são persistidas no banco de dados pelo "SaveChanges()" da gravação do erro. Ta tudo errado isso.

    Procurei na net alguma forma de fazer "Undo" do Contexto atual e não achei nada que me convenceu... será que eu estou implementando errado ou não existe outra forma de trabalhar com isso? Teria que fazer um contexto apenas para a minha gravação de log (não faz sentido para mim, pode me salavar agora... só agora...)

    Aos usuários de plantão do EF.... help.

    Valew!


    QualOperadora - Descubra a operadora dos seus contatos, inclusive números portados: http://zno.com.br/QualOperadora
    quarta-feira, 30 de novembro de 2011 19:17

Todas as Respostas

  • Olá Bruno,

    Acho que o q vc deve fazer é o seguinte:

    - Utilize transações e qualquer erro que acontecer de um rollback, utilizando o próprio Entity Framework.

    - O log vc só irá registrar no bloco Finally de um Try Catch que proteja sua aplicação. Vc pode ir acumulando todas as mensagens de log em um array ou em uma lista, e logo depois de tudo encerrado vc escreve o log, mesmo que aconteça um erro vc conseguirá dar conta de dar o rollback na base de dados e não vai perder os dados do log. Veja o exemplo abaixo:

    List<string> mensagens = new List<string>();
    
    try
    {
    // ação número 01 executada com sucesso
    mensagens.Add("Executou 01");
    
    // ação número 02 executada com sucesso
    mensagens.Add("Executou 02");
    
    // ação número 03 executada com sucesso
    mensagens.Add("Executou 03");
    
    // ação número 04 executada com sucesso
    mensagens.Add("Executou 04");
    }
    catch(Exception ex)
    {
    mensagens.Add(ex.Message);
    }
    finally
    {
    // Rotina que lê os registros de "mensagens" e grava no banco
    }
    


    Se vc notar, existe uma lista que acumula todas as mensagens para depois logar.

    Isto esta errado? Não, pois o importante é ter todos os registros do Log gravados na base depois de suas ações terem sido executadas.

    E se acontecer um erro no meio, não perderei o log? Não, pq o bloco de registro do Log fica no bloco finally, e ele sempre é executado, mesmo se acontecer um erro.

     

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quarta-feira, 30 de novembro de 2011 23:19
    Moderador