.NET 10 LTS is here, GA on November 11, 2025, and supported through November 2028. For most teams, that’s the green light to move your standard images, base containers, and CI templates to the new SDK. The upside is big: runtime speedups, C# 14 quality‑of‑life features, safer defaults in ASP.NET Core, and EF Core 10 capabilities that finally make vector search and native JSON on SQL Server first‑class. The trick is sequencing the work so you ship without surprising your ops dashboards.
Why .NET 10, and why now?
Because it’s an LTS: three years of updates, predictable monthly servicing, and a clean runway for 2026–2028 planning. If you’re on .NET 8 (LTS) or .NET 9 (STS), the path to .NET 10 is straightforward, and modern base images make it easy to validate side‑by‑side. If you’re still on .NET 6 or .NET Framework, this is the moment to stop procrastinating—vendor roadmaps, cloud platform images, and security teams will push you here anyway.
What’s new that actually moves the needle?
C# 14: small features that add up
C# 14 isn’t a flashy release, but it removes a lot of friction. You’ll use these on day one:
- Field‑backed properties with the
fieldkeyword so you can write focused getters/setters without a hand‑rolled backing field. - Extension members (including extension properties) so you can add capabilities to types you don’t own—cleaner than helper classes.
- Null‑conditional assignment (
customer?.Order = value) for tidy, safe updates. - Implicit span conversions for more natural slice/parse code without needless allocations.
- Partial constructors and events for generated+handwritten codebases.
None of this requires rewrites; you adopt it opportunistically as you touch code. But it’s worth enabling analyzers to guide usage patterns during the upgrade.
ASP.NET Core 10: security and operability first
Shipping web apps on .NET 10 gets easier—and safer:
- OpenAPI 3.1 by default and YAML output support make your API docs cleaner and more accurate for JSON Schema.
- Server‑Sent Events via
TypedResults.ServerSentEvents()gives you a simple, standards‑compliant way to push real‑time updates without WebSockets. - Passkey (WebAuthn/FIDO2) support in Identity + template-level integration so passwordless isn’t a research project.
- Automatic memory pool eviction across servers (Kestrel/IIS/HTTP.sys) trims idle memory in long‑running apps—expect lower working sets between traffic spikes.
- Deeper built‑in metrics for auth, Identity, Blazor, and memory pools. If you’re all‑in on OpenTelemetry, this pays off immediately.
- Updated dev certs and optional
.dev.localhostsuffixes reduce friction for multi‑app dev setups. - JSON Patch re‑implemented on
System.Text.Jsonfor performance and AOT compatibility. RedirectHttpResult.IsLocalUrlto stamp out open redirect footguns.
EF Core 10: vector and JSON become real
EF Core 10 brings production‑ready features that matter for modern apps:
- Vector search for Azure SQL/SQL Server 2025 with the new
vectortype and distance functions—bring RAG and semantic search closer to your data. - Native JSON type support on SQL Server 2025 with efficient updates, plus clean mapping of complex types to single JSON columns.
- Named query filters to toggle multitenancy and soft‑delete semantics per query—no more all‑or‑nothing filters.
- More predictable split query ordering and smarter parameterized collections to stabilize plans.
Performance: DATAS GC is the wildcard
If you haven’t seen DATAS yet, pay attention. Many apps will see smaller working sets and steadier behavior across core counts. Some will see different throughput or startup dynamics. Collect a perf trace in staging and compare pause time and allocation profiles before flipping environments. DATAS can be tuned—or disabled—if it doesn’t fit the workload. The point is: measure, then decide.
The 7‑Day .NET 10 Upgrade Plan
Here’s a schedule we’ve used with enterprise teams that have dozens of services and a handful of monoliths. Tweak the order based on your risk tolerance, but keep the feedback loops tight.
Day 1: Inventory and risk map
List every deployable unit, its .NET target, hosting model, and critical dependencies (EF provider versions, ASP.NET hosting bundle, OpenTelemetry, NativeAOT usage). Flag services touching payments, authentication, or peak‑traffic paths. Establish your rollback story: pin images by digest and have an immediate revert path in CI.
Need a deeper template? See our .NET 10 upgrade playbook—we break down common blockers and test matrices we use in the field.
Day 2: Toolchain and CI plumbing
Install the .NET 10 SDK on dev boxes and CI runners. Update your base images and GitHub Actions/DevOps templates to add a .NET 10 job alongside your current LTS. Keep both green before switching defaults. If you’re still on macOS‑13 hosted runners anywhere in your pipeline, plan that migration now; we’ve covered that urgency in the macOS‑13 runner deprecation guide. While you’re in CI, apply the security patches for your .NET 8/9 services too.
Day 3: Build, compile, and baseline
Bump your TargetFramework to net10.0 in a branch, fix NuGet ranges, and get clean builds. Enable C# 14. Turn on warnings as errors in a safe subset (start with analyzers around nullable, async, and performance). Generate OpenAPI in 3.1 and verify clients still build. For Blazor/SPA, validate dev server and SSR paths with updated cert behavior.
Day 4: Run the system, watch the numbers
Spin up a production‑like staging environment. Hammer it with recorded traffic. Track:
- Throughput and p95/p99 latency through the API gateway.
- GC pause time and heap size under DATAS vs your previous baseline.
- Memory pool eviction behavior during idle and sustained load.
- EF query plans and cache stability after upgrading providers.
Don’t chase microbenchmarks yet. Look for shape changes in latencies and resource curves.
Day 5: Fix the paper cuts
Typical hits: analyzers calling out legacy patterns, JSON Patch behavior differences, OpenAPI schema shifts (3.1 nullability), and stricter URL redirect checks. Adopt C# 14 improvements where they reduce code: field‑backed properties to remove one‑off fields, extension members to consolidate cross‑cutting helpers, and null‑conditional assignment to simplify guard clauses.
Day 6: Security and auth
Enable passkeys in your Identity flows for new accounts (pilot first), and verify cookie/anti‑forgery behavior with your reverse proxies. If any app still runs on .NET 8/9, ensure it picked up the October servicing fixes. Then validate IsLocalUrl guards anywhere you accept return URLs. Finish with a light threat model for SSE endpoints—rate limits, auth, and back‑pressure.
Day 7: Flip the switch (safely)
Set canaries. Promote one or two services to .NET 10, watch telemetry for an hour, widen the blast radius. Keep a branch ready to revert if GC or plan cache surprises appear. Move the rest over the next business day with change windows your support team is comfortable with.
People also ask
Is .NET 10 an LTS release?
Yes—three years of support. Plan your budgeting and team skills around staying on .NET 10 through late 2028, with monthly servicing built into your patch cadence.
Should we jump from .NET 8 straight to .NET 10?
In most cases, yes. The runtime and libraries are a direct, supported path, and you’ll pick up C# 14, ASP.NET Core 10, and EF Core 10 in one move. If you’re on .NET 9, the value is moving from STS to LTS and consolidating on one platform version across teams.
Will C# 14 break our code?
No—language updates are additive. But your analyzers may start encouraging new idioms. The biggest “gotcha” tends to be developer choice, not runtime behavior.
Does DATAS GC always help?
It often reduces memory, especially in bursty workloads. In high‑throughput or startup‑sensitive services you may prefer tuned settings—or even disabling it. Treat it like any material runtime change: measure and decide.
Checklist: production readiness for .NET 10
- CI updated to build/test on SDK 10; keep previous LTS/STSs until rollout completes.
- Container images rebuilt from a .NET 10 base; pin by digest for rollback.
- All ASP.NET Core apps generate OpenAPI 3.1; SDK clients verified.
- Observability wired: new ASP.NET metrics scraped, SLOs reviewed for thicker traffic tails.
- EF providers aligned with EF Core 10; vector/JSON features gated behind feature flags.
- Auth: passkey pilot enabled; return‑URL validation audited with
IsLocalUrl. - GC: capture traces before/after; decide on DATAS defaults vs tuned config.
- Security: October fixes applied to any services not yet on .NET 10; staging pen test rerun on SSE endpoints.
Dev notes and gotchas we’ve seen this week
OpenAPI 3.1 can change nullability representation in a way that breaks over‑strict client validators. If your TS/Java clients struggle, consider tightening your schema generation rules rather than turning 3.1 off. With EF Core 10, watch plan cache churn after switching to parameterized collections; most workloads benefit, but high‑variance lists may need explicit padding configuration. And for Blazor Server, the improved tracing is excellent when you pair it with your APM—invest an hour wiring the spans so circuit issues surface early.
Let’s get practical with EF: vector and JSON
If you’re testing AI features, the combination of EF Core 10 + SQL Server 2025 is worth prototyping today. Store embeddings in the new vector column, build hybrid keyword+vector queries, and keep the data next to transactions for strong consistency. For JSON, map complex types to a single column to simplify schema evolution where a separate table would add joins with no analytic value. Use ExecuteUpdateAsync to patch JSON values efficiently when counters or state drift.
What about CI/CD and hosted runners?
Make sure your build matrix includes net10.0 and the right SDK channel, and that your self‑hosted agents have the runtime installed. If you rely on GitHub’s hosted macOS runners for app builds or MAUI, read our note on the GitHub Actions fixes this week—there are image and policy changes that can block seemingly unrelated .NET upgrades.
Production rollout strategy we recommend
- Ship one stateless API first. Validate error rates, p95 latency, memory profile, and GC pauses.
- Follow with a stateful service (cache, queue worker). Confirm throughput under steady load.
- Upgrade EF‑heavy services third; keep a feature flag to switch vector/JSON features off.
- Move your largest service last with an off‑hours window and explicit load shedding rules.
What to do next
- Decide your target: move everything to .NET 10 this quarter, or pick the top five services and commit to dates.
- Stand up a parallel .NET 10 staging environment; don’t “toggle in place.”
- Adopt two C# 14 features team‑wide this sprint—field‑backed properties and extension members are great starts.
- Pick one EF Core 10 capability to pilot (vector search or native JSON) with an explicit success metric.
- Schedule a one‑hour GC review using DATAS metrics; keep a toggle plan documented.
Need a second set of eyes on your plan, or help unblocking your CI and runtime quirks? Our team ships this work weekly. Start with our services overview, browse relevant work in the portfolio, or just reach out on the contact page. And yes—if you’re mid‑firefight with GitHub Actions or app store changes, those playbooks are on the blog too.
