c# - EntityFramework 6 的 SqlDependency(异步)

标签 c# entity-framework asynchronous sqldependency

我正在使用 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 方法完成,然后调用第二个,它们都会按预期获得更改通知。有什么解决办法吗?

最佳答案

我对 SqlDependency 不是很熟悉,但下面的内容将允许您的 CallContext 在调用 ToListAsync 时具有正确的值(当多个调用正在运行时)。这里的概念证明,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;
        }
    }

关于c# - EntityFramework 6 的 SqlDependency(异步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17334935/

相关文章:

node.js - 如何在 Node Js 中将 A-lib 与 fastify 一起使用

c# - 为什么要在空 try block 中使用 try {} finally {}?

c# - c# 中如何处理对象已处置异常未处理的异常?

c# - Azure管道- 'The type or namespace name '基础设施“命名空间中不存在”

c# - 使用 Entity Framework 选择单行。 Entity Framework 没有生成sql语句吧?

javascript - 重定向到另一个页面会阻止函数返回它们的值

asynchronous - 异步 mvvm 卡住 GUI

c# - HttpContext 头

c# - 在C#中使用XPath选择单选按钮

c# - 使用 AutoMapper 映射后,上下文未更新加载的实体