Eu tenho algumas tarefas de longa duração no meu servidor. Basicamente, eles são como tarefas agendadas - elas são executadas de tempos em tempos.
Todos eles exigiam acesso ao banco de dados e eu uso o Entity Framework para isso. Cada tarefa usa um DbContext para acesso.
O objeto DbContext deve ser recriado a cada execução ou devo reutilizá-lo?
Respostas:
3 para resposta № 1Eu deveria dizer "depende" como provavelmentecenários em que ambas as respostas são válidas, no entanto, a resposta mais razoável é "o contexto deve ser descartado assim que não for necessário", o que na prática significa "descartá-lo mais cedo do que tarde".
O risco que surge de tal resposta é queos novatos às vezes concluem que o contexto deve ser descartado o mais possível, o que às vezes leva a um código que reviso onde há "usings" consecutivos que criam um contexto, usam para uma ou duas operações, descartam e então outro contexto surge na próxima linha . Isso obviamente não é recomendado também.
No caso de aplicativos da web, o ciclo de vida natural éconectado a um ciclo de vida de solicitações da web. No caso de serviços do sistema / outras aplicações de execução longa, uma das estratégias de ciclo de vida é "por instância de processo de negócio" / "por instância de uso" onde implementações de processamento de negócios / caso de uso definem fronteiras naturais onde instâncias separadas de contextos fazem sentido.
1 para resposta № 2
Sim, DbContext só deve viver por um tempo muito curto. É efetivamente sua unidade de trabalho
Você deve definitivamente criá-lo cada vez que você for usá-lo. (Bem, você deve injetá-lo, mas essa é outra discussão :-))
Atualização: OK, eu aceito que "criá-lo cada vez que você vai usá-lo" poderia ser enganador. Eu estou tão acostumado a contextualizar ser uma instância em uma classe que é injetada e assim vive apenas pela vida de um pedido que eu esforce-se para pensar de outra maneira ... a resposta do @wiktor é definitivamente melhor, pois expressa mais corretamente a idéia de que você deve "desfazer-se mais cedo ou mais tarde"