.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.jsonif you pin one. -
TargetFrameworktonet10.0(checkDirectory.Build.propsfirst, it is often set there). - Update
Microsoft.*packages to 10.x together: ASP.NET Core, EF Core,Microsoft.Extensions.*. -
PackageReferencewithout 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,NuGetAuditModedefaults toall, so vulnerable transitive packages now produce NU1901 to NU1904 warnings (details). WithTreatWarningsAsErrors, 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,IWebHostandWebHostare obsolete. OldProgram.csfiles still usingWebHost.CreateDefaultBuilderwill light up with warnings. -
ForwardedHeadersOptions.KnownNetworksis obsolete, useKnownIPNetworkswithSystem.Net.IPNetwork(warning ASPDEPR005). -
IActionContextAccessoris obsolete,WithOpenApiis 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 (
@cityinstead of@__city_0). Snapshot tests that compare SQL text will fail, and expect a burst of plan recompilation after deploy. - EF now injects
Application Nameinto the connection string if you don't set one. If you mix EF with Dapper or ADO.NET inside aTransactionScope, the two different connection strings can escalate to a distributed transaction. SettingApplication Nameyourself avoids it. - With
UseAzureSqlor compatibility level 170, JSON columns map to the newjsontype, and your next migration will alter existingnvarchar(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 efon multi-targeted projects now requires--framework. - If you use Microsoft.Data.Sqlite:
DateTimeOffsetandDateTimehandling moved to UTC in three places, all marked high impact.
5. Core libraries (full list)
-
System.Linq.AsyncEnumerableis now in the framework. If you referenceSystem.Linq.Async, remove it or move to 7.0.0, otherwise you get ambiguity errors (details).SelectAwaitcall sites becomeSelect. -
BackgroundService.ExecuteAsyncnow runs entirely on a background thread. If you relied on the synchronous part before the firstawaitrunning during startup, move it to the constructor orStartAsync(details). - Null values in configuration are now preserved,
System.Text.Jsonchecks 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.0image 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
The source is on GitHub. Happy to hear what it misses. If you would rather hand the upgrade off, details are here.










