gpt4 book ai didi

c# - 将 Entity Framework 6 与 Azure SQL 结合使用时,异步 LINQ 查询为空?

转载 作者:行者123 更新时间:2023-11-30 20:34:48 24 4
gpt4 key购买 nike

我有一个 Web 应用程序,最近迁移到了 Azure。其中我有相当多的查询使用 EF 的异步 LINQ 扩展(下面的示例)。然而,自从迁移到 Azure 以来,我注意到其中一些查询不仅返回 null,而且 MiniProfiler 甚至没有注册它们:

// returns null. No queries logged in MiniProfiler
var someUser = await context.Users.FirstOrDefaultAsync(x => x.Id == id)

// works 100% as expected
var someUser = context.Users.FirstOrDefault(x => x.Id == id)

我还尝试通过调用 .ToListAsync().FirstOrDefault() 来“欺骗”它。当然,这也行不通。

就其值(value)而言,此应用程序使用 .NET 4.5 和 EF6。它还在传统托管的生产环境中运行了约 18 个月。

我确信这个问题已经在某个地方得到了解答,但我一直很难找到任何相关信息。

<小时/>

编辑:上例中的id实际上来自一个单独的方法,该方法从当前主体获取当前用户ID:

// .GetUserId() is an extension method to get the userid from the principal
// Works with SQL Server
// Does not work with Azure SQL
var someUser = await context.Users.FirstOrDefaultAsync(x => x.Id == HttpContext.Current.GetUserId());

为了解决这个问题,我取消了该调用:

var userId = HttpContext.Current.GetUserId();
var someUser = await context.Users.FirstOrDefaultAsync(x => x.Id == userId);

尽管如此,有谁知道为什么这适用于传统 SQL Server,但在连接到 Azure SQL 数据库时却不起作用?

最佳答案

执行异步代码时,EF6 使用 .ConfigureAwait(false) 来防止死锁,因此不再保证延续(await 之后的方法体)执行同一个线程。

当在本地 SQL Server 上运行时,线程被阻塞的时间通常低于某个阈值,因此延续会同步执行以避免上下文切换。然而,SQL Azure 有更多的延迟并触发正确的异步执行,导致在这种情况下丢失上下文。

ASP.NET 仅在请求线程上设置 HttpContext.Current,因此当 EF 在线程池线程上计算 lambda 时,它将为 null。

关于c# - 将 Entity Framework 6 与 Azure SQL 结合使用时,异步 LINQ 查询为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38706958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com