Skip to main content

GraphQL Hot Chocolate - Entity Framework error: A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext

 If you try to combine HotChocolate GrapQL implementation together with Entity Framework, a possible attempt could look like this:

Unfortunately this doesn't work the moment multiple resolvers kick in. When you try to resolve multiple queries/fields, chances are you end up with the following exception message:

"message": "A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.",

        "stackTrace": "   at Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()\r\n   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()\r\n   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)\r\n   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)\r\n   at Bridges.Sectors.Infrastructure.Repositories.SectorRepository.GetSectorById(Guid sectorId) in C:\\Users\\StVa\\source\\repos\\bridges\\Sector\\Bridges.Sectors.Infrastructure\\Repositories\\SectorRepository.cs:line 46\r\n   at Bridges.Sectors.API.Services.SectorService.GetSector(Guid sectorId) in C:\\Users\\StVa\\source\\repos\\bridges\\Sector\\Bridges.Sectors.API\\Services\\SectorService.cs:line 26\r\n   at Bridges.Sectors.API.Schema.Queries.SectorQuery.GetSector(ISectorService sectorService, Guid sectorId) in C:\\Users\\StVa\\source\\repos\\bridges\\Sector\\Bridges.Sectors.API\\Schema\\Queries\\SectorQuery.cs:line 27\r\n   at HotChocolate.Resolvers.Expressions.ExpressionHelper.AwaitTaskHelper[T](Task`1 task)\r\n   at HotChocolate.Types.FieldMiddlewareCompiler.<>c__DisplayClass3_0.<<CreateResolverMiddleware>b__0>d.MoveNext()\r\n--- End of stack trace from previous location ---\r\n   at HotChocolate.Execution.Processing.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken)\r\n   at HotChocolate.Execution.Processing.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken)",

This is because HotChocolate executes multiple resolvers in parallel and the DbContext is inherently not threadsafe. More about this here.

You could try to go for a single threaded execution model but this would end up being a fight against GraphQL.

Luckily the creators of HotChocolate got your back and created a HotChocolate.Data.EntityFramework nuget package. This package allows you to create a pool of DbContexts and use these in your resolvers.

First register a DbContext pool:

And then we can update our code to use a DbContext instance from this pool:

More information about this feature here:https://chillicream.com/docs/hotchocolate/integrations/entity-framework 

Popular posts from this blog

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

VS Code Planning mode

After the introduction of Plan mode in Visual Studio , it now also found its way into VS Code. Planning mode, or as I like to call it 'Hannibal mode', extends GitHub Copilot's Agent Mode capabilities to handle larger, multi-step coding tasks with a structured approach. Instead of jumping straight into code generation, Planning mode creates a detailed execution plan. If you want more details, have a look at my previous post . Putting plan mode into action VS Code takes a different approach compared to Visual Studio when using plan mode. Instead of a configuration setting that you can activate but have limited control over, planning is available as a separate chat mode/agent: I like this approach better than how Visual Studio does it as you have explicit control when plan mode is activated. Instead of immediately diving into execution, the plan agent creates a plan and asks some follow up questions: You can further edit the plan by clicking on ‘Open in Editor’: ...