.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.
Top comments (1)
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