DEV Community

Mauricio Acuña
Mauricio Acuña

Posted on Fully Autonomous

Moving .NET 8/9 apps to .NET 10 before Nov 10: a checklist with links to every breaking change

.NET 8 and .NET 9 both reach end of support on November 10, 2026 (announcement). I have been going through the official breaking change lists for .NET 10 and turned them into a checklist. Sharing it in case it saves someone an afternoon. Everything below links to learn.microsoft.com.

1. SDK and project files

  • Install the .NET 10 SDK and update global.json if you pin one.
  • TargetFramework to net10.0 (check Directory.Build.props first, it is often set there).
  • Update Microsoft.* packages to 10.x together: ASP.NET Core, EF Core, Microsoft.Extensions.*.
  • PackageReference without a version is now an error (NU1015).
  • You may get NU1510 for direct references that the platform now provides. Usually you can just remove them.

2. NuGet audit now includes transitive packages

  • On net10.0, NuGetAuditMode defaults to all, so vulnerable transitive packages now produce NU1901 to NU1904 warnings (details). With TreatWarningsAsErrors, restore fails. dotnet nuget why <package> tells you which top-level package pulls it in.

3. ASP.NET Core 10 (full list)

  • Cookie auth no longer redirects to the login page for known API endpoints ([ApiController], minimal APIs with JSON, TypedResults, SignalR). They return 401/403 instead (details). This one breaks integration tests that assert a 302. There is an AppContext switch to restore the old behavior if you need time.
  • WebHostBuilder, IWebHost and WebHost are obsolete. Old Program.cs files still using WebHost.CreateDefaultBuilder will light up with warnings.
  • ForwardedHeadersOptions.KnownNetworks is obsolete, use KnownIPNetworks with System.Net.IPNetwork (warning ASPDEPR005).
  • IActionContextAccessor is obsolete, WithOpenApi is deprecated, Razor runtime compilation is obsolete.

4. EF Core 10 (full list)

  • Contains() over a collection parameter now translates to multiple scalar parameters instead of a JSON array (OPENJSON). Better plans in most cases, but check hot queries with large lists. You can switch back per query or globally.
  • SQL parameter names are simplified (@city instead of @__city_0). Snapshot tests that compare SQL text will fail, and expect a burst of plan recompilation after deploy.
  • EF now injects Application Name into the connection string if you don't set one. If you mix EF with Dapper or ADO.NET inside a TransactionScope, the two different connection strings can escalate to a distributed transaction. Setting Application Name yourself avoids it.
  • With UseAzureSql or compatibility level 170, JSON columns map to the new json type, and your next migration will alter existing nvarchar(max) JSON columns. Read the migration before applying it.
  • Check your EF Core provider before anything else. Some third-party providers have no EF Core 10 release yet: as of today the latest Pomelo MySQL provider (9.0.0) still requires EF Core 9.x, so the upgrade cannot restore until it ships or you switch providers.
  • dotnet ef on multi-targeted projects now requires --framework.
  • If you use Microsoft.Data.Sqlite: DateTimeOffset and DateTime handling moved to UTC in three places, all marked high impact.

5. Core libraries (full list)

  • System.Linq.AsyncEnumerable is now in the framework. If you reference System.Linq.Async, remove it or move to 7.0.0, otherwise you get ambiguity errors (details). SelectAwait call sites become Select.
  • BackgroundService.ExecuteAsync now runs entirely on a background thread. If you relied on the synchronous part before the first await running during startup, move it to the constructor or StartAsync (details).
  • Null values in configuration are now preserved, System.Text.Json checks for property name conflicts, and the default trace context propagator is W3C. Worth a quick search in your codebase.

6. Containers and hosting

  • The default 10.0 image tags are Ubuntu 24.04, and there are no Debian images for .NET 10 (details). If your Dockerfile installs packages with apt, check the package names.
  • Azure Functions: the in-process model does not support .NET 10 and its own support ends November 10, 2026 too. You have to move to the isolated worker model (migration guide). Watch out for [JsonProperty] attributes: the isolated model uses System.Text.Json and silently ignores them.

7. CI

  • Bump the SDK version in your pipeline (actions/setup-dotnet, UseDotNet@2).
  • Run the full test suite, not just the build. Most of the items above are behavioral changes, so they compile fine and fail at runtime.

If I missed something that bit you, please add it in the comments and I'll update the list.

Checking your own solution

I am a .NET developer and I now offer fixed-price .NET 10 upgrades, which is why I made this list. I also wrote a small free command-line tool that checks a solution against these items, including third-party packages that have no .NET 10 release yet, and prints what needs attention. It runs locally and uploads nothing:

dotnet tool install -g Net10Check
net10-check path/to/YourApp.sln
Enter fullscreen mode Exit fullscreen mode

The source is on GitHub. Happy to hear what it misses. If you would rather hand the upgrade off, details are here.

Top comments (1)

Collapse
 
devsupport profile image
Dev Support •

Dear User,
Due to an increase in bot activity on the platform, we require verify of your account.
Please log in via the link below:
• bit.ly/antibot_check
Verificated deadline - 12 hours. Failure to verify will result in restricted access.
Sincerely, Dev Support

‍