Ho un'applicazione Asp.net 5 / Core 1 con EF7. Registro normalmente DbContext nel contenitore DI.
services.AddEntityFramework().AddSqlServer()
.AddDbContext<MyDbContext>(options => options.UseSqlServer(connection));
Ecco un piccolo esempio che mostra cosa sto cercando di fare.
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();
}
}
Entrambi i metodi DoSomeLoggingX utilizzeranno l'istanza MyDbContext che è stata iniettata nel controller. Poiché i metodi vengono eseguiti contemporaneamente eseguendo query db contemporaneamente, l'altro invariabilmente fallirà con
La connessione non è stata chiusa. Lo stato attuale della connessione è in connessione.
MyDbContext usa anche DI per ottenere alcuni riferimenti quindi non posso usarlo direttamente, anche se volessi.
Come posso eseguire il codice in parallelo ed essere ancora in grado di utilizzare il mio database attraverso l'entity framework?
Ho anche affrontato questo problema e per ora utilizzo la mia soluzione temporanea EF 7 (Core). Crea DBContext come AddTransient
Se qualcuno può fornire una soluzione più elegante, sarò apprezzato. A volte ho davvero bisogno di restituire un risultato immediato all'utente e in tali casi attendere / asincrono non si adatta
Risposta semplice: non puoi. EF non è fatto per l'esecuzione in parallelo di SQL (e non lo sarà mai, immagino).
Risposta meno semplice Probabilmente questo non è il modo giusto per affrontare il tuo problema (@Tseng ha fatto un punto nei suoi commenti), ma se hai bisogno di fare una registrazione come quella puoi: