SqlDependency avec EntityFramework 6 (async)

J’utilise les fonctionnalités de requête async EF 6, telles que

 var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); 

Je souhaite également démarrer des dépendances SQL sur ces requêtes afin de pouvoir être averti lorsque les données de la firebase database sont modifiées. Je peux faire cela en utilisant le System.Runtime.Remoting.Messaging.CallContext comme suit:

  async Task GetData() { using (ClientsContext context = new ClientsContext()) // subclass of DbContext { SqlDependency.Start(context.Database.Connection.ConnectionSsortingng); SqlDependency dependency = new SqlDependency(); dependency.OnChange += (sender, e) => { Console.Write(e.ToSsortingng()); }; System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id); var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); } } 

.. et ça marche bien. Mais je rencontre un problème si je souhaite avoir une SqlDependency sur plusieurs requêtes. Si j’ai deux méthodes async similaires à GetData() ci-dessus et que je les exécute en même temps, seule la première recevra des notifications de modification. Je suppose que cela est dû au fait que CallContext a le cookie défini par chaque méthode successivement. Si j’attends la fin de la première méthode async , puis appelez la seconde, ils reçoivent tous deux les notifications de modification attendues. Y a-t-il une solution à cela?

Je ne connais pas trop SqlDependency, mais ce qui suit permettra à votre CallContext d’avoir la valeur correcte au moment de l’appel de ToListAsync (lorsque plusieurs appels sont en cours d’exécution). Preuve de concept ici, https://dotnetfiddle.net/F8FnFe

  async Task> GetData() { using (ClientsContext context = new ClientsContext()) // subclass of DbContext { SqlDependency.Start(context.Database.Connection.ConnectionSsortingng); SqlDependency dependency = new SqlDependency(); dependency.OnChange += (sender, e) => { Console.Write(e.ToSsortingng()); }; Task> task = Task>>.Factory.StartNew(async () => { System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id); var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); }).Unwrap(); return await task; } }