¿Cómo usar DbContext inyectado en métodos paralelos en asp.net core y ef7?

Tengo una aplicación Asp.net 5 / Core 1 con EF7. Normalmente registro el DbContext en el contenedor DI.

services.AddEntityFramework().AddSqlServer() .AddDbContext(options => options.UseSqlServer(connection)); 

Aquí hay una pequeña muestra que muestra lo que estoy tratando de hacer.

 public class MyController : Controller { MyDbContext _myDbContext; public MyController(MyDbContext myDbContext) { _myDbContext = myDbContext; } public IActionResult Index() { //Just start these and don't wait for them to finish //We don't care if they succeed or not Task.Run(() => DoSomeLogging1()); Task.Run(() => DoSomeLogging2()); return View(); } private void DoSomeLogging1() { _myDbContext.Items.ToList(); } private void DoSomeLogging2() { _myDbContext.Items.ToList(); } } 

Ambos métodos DoSomeLoggingX utilizarán la instancia MyDbContext que se inyectó al controlador. Dado que los métodos se ejecutan al mismo tiempo haciendo consultas db al mismo tiempo, el otro siempre fallará con

La conexión no estaba cerrada. El estado actual de la conexión se está conectando.

MyDbContext también usa DI para obtener algunas referencias, por lo que no puedo usarlo directamente aunque quisiera.

¿Cómo puedo ejecutar el código en paralelo y aún puedo usar mi base de datos a través del marco de la entidad?

También me enfrenté a este problema y por ahora uso mi solución temporal EF 7 (Core). Crear DBContext como AddTransient

Si alguien puede proporcionar una solución más elegante seré apreciado. A veces realmente necesito devolver el resultado instantáneo al usuario y, en tales casos, esperar / async no encaja

Respuesta simple: no puedes. EF no está hecho para la ejecución de sql en paralelo (y nunca lo será, supongo).

Respuesta menos simple. Probablemente esta no sea la forma correcta de abordar su problema (@Tseng hizo un punto en sus comentarios), pero si necesita hacer un registro de ese tipo de cosas, puede:

  • haga que las dos acciones de registro sean secuenciales y compartan la misma instancia de EF
  • use SQL simple y antiguo con un objeto SqlConnection (que funciona perfectamente con el parallel processing), y es más rápido
  • use un marco de registro como NLog que admita el enfoque de registro y olvido