我正在使用EF 6的async
查询功能,例如
var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
我还想在这些查询中启动SQL依赖项,以便在数据库中的数据更改时得到通知。我可以使用 System.Runtime.Remoting.Messaging.CallContext
实现如下:
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();
}
}
..然后它正常工作。但是如果我想在多个查询上使用 SqlDependency
,我会遇到问题。如果我有两个类似于 GetData()
的 async
方法,并同时运行它们,只有第一个方法会收到更改通知。我认为这是由于CallContext按顺序由每个方法设置的cookie所引起的。如果我等待第一个 async
方法完成,然后调用第二个方法,则它们都会按预期接收到更改通知。有没有解决方法?