c# - SqlDependency con EntityFramework 6(async)
sqldependency c# (1)
No estoy muy familiarizado con SqlDependency, pero lo que sigue a continuación permitirá que CallContext tenga el valor correcto en el momento en que se llama a ToListAsync (cuando se ejecutan varias llamadas). Prueba de concepto aquí, https://dotnetfiddle.net/F8FnFe
async Task<List<Client>> GetData()
{
using (ClientsContext context = new ClientsContext()) // subclass of DbContext
{
SqlDependency.Start(context.Database.Connection.ConnectionString);
SqlDependency dependency = new SqlDependency();
dependency.OnChange += (sender, e) =>
{
Console.Write(e.ToString());
};
Task<List<Client>> task = Task<Task<List<Client>>>.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;
}
}
Estoy usando las funciones de consulta async
EF 6, como
var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
También quiero iniciar dependencias SQL en estas consultas para poder recibir notificaciones cuando cambien los datos en la base de datos. Puedo hacer esto usando System.Runtime.Remoting.Messaging.CallContext
siguiente manera:
async Task GetData()
{
using (ClientsContext context = new ClientsContext()) // subclass of DbContext
{
SqlDependency.Start(context.Database.Connection.ConnectionString);
SqlDependency dependency = new SqlDependency();
dependency.OnChange += (sender, e) =>
{
Console.Write(e.ToString());
};
System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id);
var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
}
}
.. y funciona bien. Pero me encuentro con un problema si quiero tener una SqlDependency
en más de una consulta. Si tengo dos métodos async
similares a GetData()
anteriores, y ejecuto ambos al mismo tiempo, solo el primero recibirá las notificaciones de cambio. Supongo que esto se debe a que CallContext tiene la cookie establecida por cada método en sucesión. Si espero a que se complete el primer método async
, llame al segundo, ambos reciben las notificaciones de cambio como se esperaba. Hay alguna solución para esto?