[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-migrating-linq-to-sql-to-ef-core":3,"mdc--cfseh6-key":36,"related-repo-microsoft-migrating-linq-to-sql-to-ef-core":1954,"related-org-microsoft-migrating-linq-to-sql-to-ef-core":2052},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":34,"mdContent":35},"migrating-linq-to-sql-to-ef-core","migrate LINQ to SQL to EF Core","Migrates LINQ to SQL (System.Data.Linq) data access layer to Entity Framework Core during .NET Framework to modern .NET upgrades. Covers DataContext to DbContext conversion, DBML entity mapping to EF Core model configuration, stored procedure migration, query translation differences, and concurrency handling changes. Use when assessment detects LINQ to SQL usage or when upgrading projects referencing System.Data.Linq. Triggers for \"LINQ to SQL\", \"System.Data.Linq\", \"DataContext migration\", \"DBML to EF Core\", \"linq2sql\", \"migrate LINQ to SQL\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,17,20,23],{"name":13,"slug":14,"type":15},".NET","net","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Database","database",{"name":21,"slug":22,"type":15},"Migration","migration",{"name":24,"slug":25,"type":15},"ORM","orm",7,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins","2026-07-18T05:14:14.980851",null,1,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fupgrade-agent\u002Fextenders\u002Fupgrade-dotnet\u002Fupgrade\u002Fskills\u002Flazy\u002Fdata\u002Fmigrating-linq-to-sql-to-ef-core","---\r\nname: migrating-linq-to-sql-to-ef-core\r\ndescription: >\r\n  Migrates LINQ to SQL (System.Data.Linq) data access layer to Entity Framework Core during .NET\r\n  Framework to modern .NET upgrades. Covers DataContext to DbContext conversion, DBML entity\r\n  mapping to EF Core model configuration, stored procedure migration, query translation\r\n  differences, and concurrency handling changes. Use when assessment detects LINQ to SQL usage or\r\n  when upgrading projects referencing System.Data.Linq. Triggers for \"LINQ to SQL\",\r\n  \"System.Data.Linq\", \"DataContext migration\", \"DBML to EF Core\", \"linq2sql\",\r\n  \"migrate LINQ to SQL\".\r\nmetadata:\r\n  traits: .NET|CSharp|VisualBasic|DotNetCore\r\n---\r\n\r\n# LINQ to SQL to Entity Framework Core Migration\r\n\r\n## Overview\r\n\r\nMigrates .NET Framework projects from LINQ to SQL (`System.Data.Linq`) to Entity Framework Core. LINQ to SQL is not available in .NET 6+ — this is a migration blocker, not an optional improvement.\r\n\r\n**Reference files for detailed patterns:**\r\n- `ref\u002Fentity-mapping-conversion.md` — DBML\u002Fattribute mapping to EF Core\r\n- `ref\u002Fdatacontext-to-dbcontext.md` — DataContext lifecycle and API migration\r\n- `ref\u002Fquery-translation-gotchas.md` — Query behavior differences (critical for runtime correctness)\r\n- `ref\u002Fstored-procedure-migration.md` — SP\u002Ffunction mapping\r\n- `ref\u002Fconcurrency-and-change-tracking.md` — UpdateCheck\u002Fconflict resolution\r\n- `ref\u002Frelationship-migration.md` — EntitySet\u002FEntityRef to navigation properties\r\n\r\n## Prerequisites\r\n\r\nVerify LINQ to SQL usage before proceeding:\r\n1. Check for `System.Data.Linq` assembly reference in the project file\r\n2. Search for `.dbml` files in the project directory\r\n3. Search for `using System.Data.Linq` in code files\r\n\r\nIf none found, skip this skill.\r\n\r\n## Workflow\r\n\r\n```\r\nMigration Progress:\r\n- [ ] Step 1: Assess LINQ to SQL usage scope\r\n- [ ] Step 2: Set up EF Core infrastructure\r\n- [ ] Step 3: Scaffold or convert entity model\r\n- [ ] Step 4: Migrate DataContext to DbContext\r\n- [ ] Step 5: Migrate stored procedures and functions\r\n- [ ] Step 6: Fix relationship loading patterns\r\n- [ ] Step 7: Migrate concurrency handling\r\n- [ ] Step 8: Fix query translation issues\r\n- [ ] Step 9: Validate\r\n- [ ] Step 10: Remove LINQ to SQL artifacts\r\n```\r\n\r\n### Step 1: Assess LINQ to SQL Usage Scope\r\n\r\nBefore making changes, inventory the full scope. This determines effort and identifies blockers.\r\n\r\nFind and count:\r\n- `.dbml` files and their entity\u002FSP counts (parse the XML)\r\n- DataContext classes (search for `: DataContext` or `: System.Data.Linq.DataContext`)\r\n- DataContext instantiation points (`new *DataContext(`)\r\n- Stored procedure mappings (`[Function(` attribute usage)\r\n- `IMultipleResults` usage (**blocker** — no EF Core equivalent; see `ref\u002Fstored-procedure-migration.md`)\r\n- `EntitySet\u003CT>` and `EntityRef\u003CT>` usage counts\r\n- `UpdateCheck.WhenChanged` usage (requires concurrency strategy decision)\r\n- Partial class extensions of generated entities (business logic to preserve)\r\n\r\nFlag these blockers early:\r\n- `IMultipleResults` → requires ADO.NET fallback or SP redesign\r\n- `UpdateCheck.WhenChanged` → no direct EF Core equivalent (see `ref\u002Fconcurrency-and-change-tracking.md`)\r\n\r\n### Step 2: Set Up EF Core Infrastructure\r\n\r\n1. Add NuGet packages:\r\n   - `Microsoft.EntityFrameworkCore.SqlServer` (or appropriate provider)\r\n   - `Microsoft.EntityFrameworkCore.Design` (for tooling)\r\n2. Ensure the project targets .NET 6+ (should already be the case in an upgrade scenario)\r\n\r\n### Step 3: Create New EF Core Entity Model\r\n\r\n**CRITICAL: Create new files — do NOT rewrite the DBML-generated `*.designer.cs` file in place.**\r\n\r\nThe `*.designer.cs` file (e.g., `CompanyDB.designer.cs`) was auto-generated by the LINQ to SQL O\u002FR Designer. It is full of LINQ to SQL plumbing (`INotifyPropertyChanging`, `EntitySet\u003CT>`, `EntityRef\u003CT>`, `OnXChanging`\u002F`OnXChanged` partial methods). Do not attempt to \"convert\" this file into EF Core entities — it will retain confusing artifacts and the `.designer.cs` name implies auto-generation.\r\n\r\n**Instead, create new clean files:**\r\n\r\n1. **New DbContext file** — e.g., `MyDbContext.cs` (or `{OriginalDataContextName}DbContext.cs`). Define the `DbContext` subclass with `DbSet\u003CT>` properties here.\r\n2. **New entity class files** — create one file per entity class (e.g., `Entities\u002FCustomer.cs`, `Entities\u002FOrder.cs`) or a single `Entities.cs` file for small models. Write clean POCO classes with EF Core data annotations or Fluent API configuration.\r\n3. **Preserve partial class logic** — if the project has partial classes extending DBML-generated entities (separate from the `.designer.cs` file), migrate that business logic into the new entity files.\r\n\r\n**Recommended approach: Scaffold first, then reconcile.**\r\n\r\n1. Use `dotnet ef dbcontext scaffold \"ConnectionString\" Microsoft.EntityFrameworkCore.SqlServer -o Entities` to generate baseline entities from the existing database into a new folder\r\n2. Compare scaffolded entities with DBML-defined entities:\r\n   - Reconcile custom C# names from DBML (the DBML may rename entities\u002Fproperties differently from the database)\r\n   - Preserve custom partial class logic from existing code\r\n3. Apply Fluent API configuration for non-convention mappings\r\n4. If scaffolding is not possible (no database access), manually create entity POCOs by reading the `.dbml` XML to extract table\u002Fcolumn definitions, then translate to EF Core attributes\r\n\r\nSee `ref\u002Fentity-mapping-conversion.md` for the complete attribute mapping table and DBML conversion strategy.\r\n\r\n**Important:** During conversion, both LINQ to SQL and EF Core use `[Table]` and `[Column]` attributes from different namespaces. Use fully-qualified names or manage `using` directives carefully to avoid ambiguous reference errors.\r\n\r\n### Step 4: Migrate DataContext to DbContext\r\n\r\nReplace all DataContext usage with the **new** DbContext class created in Step 3. This is not just a rename — the lifecycle model differs fundamentally.\r\n\r\nUpdate all consuming code to reference the new DbContext class name and the new entity types:\r\n- `Table\u003CT>` properties → `DbSet\u003CT>` properties\r\n- `SubmitChanges()` → `SaveChanges()` \u002F `SaveChangesAsync()`\r\n- `GetChangeSet()` → `ChangeTracker.Entries()`\r\n- `ExecuteCommand()` → `Database.ExecuteSqlRaw()`\r\n- `ExecuteQuery\u003CT>()` → `FromSqlRaw()` \u002F `SqlQueryRaw\u003CT>()`\r\n- `DataContext.Log` → `ILoggerFactory` \u002F `LogTo()` on `DbContextOptionsBuilder`\r\n- `ObjectTrackingEnabled = false` → `AsNoTracking()` queries\r\n- Direct instantiation (`new MyDataContext(conn)`) → DI-injected DbContext\r\n\r\n**Critical:** If DataContext was used in `using` blocks and you migrate to DI-managed DbContext (scoped lifetime), remove the `using` blocks — the DI container manages disposal. Keeping both causes premature disposal.\r\n\r\nSee `ref\u002Fdatacontext-to-dbcontext.md` for detailed API mappings and lifecycle patterns.\r\n\r\n### Step 5: Migrate Stored Procedures and Functions\r\n\r\nLINQ to SQL maps SPs as methods on DataContext with `[Function]` attributes. EF Core has no attribute-based SP mapping.\r\n\r\nFor each stored procedure:\r\n- SPs returning entity types → `FromSqlRaw(\"EXEC sp_name @p0, @p1\", params)`\r\n- SPs with no return → `Database.ExecuteSqlRaw()`\r\n- SPs with non-entity results → `SqlQueryRaw\u003CT>()` (EF Core 8+) with `[Keyless]` result types\r\n- SPs with output parameters → use `SqlParameter` objects directly\r\n- UDFs → `HasDbFunction()` in Fluent API\r\n\r\nSee `ref\u002Fstored-procedure-migration.md` for complete patterns and the `IMultipleResults` blocker.\r\n\r\n### Step 6: Fix Relationship Loading Patterns\r\n\r\nLINQ to SQL lazy-loads via `EntitySet\u003CT>` \u002F `EntityRef\u003CT>` by default. EF Core does NOT lazy-load by default.\r\n\r\nThis is the highest-risk area for subtle runtime bugs:\r\n1. Replace `EntitySet\u003CT>` → `ICollection\u003CT>`\r\n2. Replace `EntityRef\u003CT>` → standard navigation property\r\n3. **Find all navigation property access patterns** and add `Include()` \u002F `ThenInclude()` calls\r\n4. Convert `DataLoadOptions.LoadWith\u003CT>()` → `Include()`\r\n5. Convert `DataLoadOptions.AssociateWith\u003CT>()` → filtered includes\r\n\r\nCode that worked before (`order.Customer.Name`) will return `null` \u002F throw `NullReferenceException` without explicit loading.\r\n\r\nSee `ref\u002Frelationship-migration.md` for detailed patterns.\r\n\r\n### Step 7: Migrate Concurrency Handling\r\n\r\nIf the project uses `UpdateCheck` attributes on columns, a concurrency strategy decision is needed.\r\n\r\nDecision tree:\r\n1. Project uses `rowversion`\u002F`timestamp` column → use `[Timestamp]` attribute (straightforward)\r\n2. Project uses `UpdateCheck.Always` on all columns → add a `rowversion` column (recommended) or use `[ConcurrencyCheck]`\r\n3. Project uses `UpdateCheck.WhenChanged` → **no direct equivalent** — recommend adding `rowversion` column\r\n4. `UpdateCheck.Never` → those columns simply don't get `[ConcurrencyCheck]`\r\n\r\nAlso migrate conflict resolution: `ChangeConflictException` → `DbUpdateConcurrencyException` (different resolution API).\r\n\r\nSee `ref\u002Fconcurrency-and-change-tracking.md` for the complete decision tree and API mappings.\r\n\r\n### Step 8: Fix Query Translation Issues\r\n\r\nEF Core is stricter than LINQ to SQL about query translation. The #1 source of runtime breaks:\r\n\r\n- **Client-side evaluation**: LINQ to SQL silently evaluated untranslatable expressions client-side. EF Core throws. Add `.AsEnumerable()` before client-side operations.\r\n- **GroupBy**: Complex GroupBy with materialization fails in EF Core\r\n- **Take\u002FSkip without OrderBy**: EF Core requires explicit `OrderBy`\r\n- **String comparison**: Case-sensitivity may differ by provider\r\n- **CompiledQuery**: Remove `CompiledQuery.Compile()` calls — EF Core handles compilation automatically\r\n\r\nSee `ref\u002Fquery-translation-gotchas.md` for the complete list.\r\n\r\n### Step 9: Validate\r\n\r\n1. Build all affected projects — zero errors required\r\n2. Search for remaining `System.Data.Linq` references in code\r\n3. Search for remaining `DataContext`, `EntitySet`, `EntityRef` type usage\r\n4. Verify navigation property loading works (test queries that traverse relationships)\r\n5. Verify stored procedure calls work\r\n6. Verify concurrency conflict handling works\r\n\r\n**Only proceed to Step 10 after validation passes.** The old `.dbml` and `.designer.cs` files are useful as a reference if you need to fix issues found during validation.\r\n\r\n### Step 10: Remove LINQ to SQL Artifacts\r\n\r\n**MANDATORY — do not skip this step.** LINQ to SQL artifacts serve no purpose after migration and will confuse future developers.\r\n\r\nDelete these files (verify each exists before deleting):\r\n1. **`*.dbml`** files — the LINQ to SQL O\u002FR Designer model definition (XML). Not used by EF Core.\r\n2. **`*.dbml.layout`** files — Visual Studio designer UI layout. Not used by EF Core.\r\n3. **DBML-generated `*.designer.cs`** files — the auto-generated DataContext and entity classes. These must have been replaced by new clean files in Step 3. **Do NOT delete WinForms\u002FWPF `*.Designer.cs` files** — only the one that was generated from the `.dbml` (typically named `{DbmlName}.designer.cs` and containing `DataContext` inheritance).\r\n\r\nThen clean up remaining references:\r\n4. Remove `System.Data.Linq` assembly reference from the project file (`.csproj`)\r\n5. Remove `using System.Data.Linq` and `using System.Data.Linq.Mapping` statements from all code files\r\n6. Remove any `\u003CNone Include=\"*.dbml\">` or `\u003CCompile Include=\"*.designer.cs\">` entries with `\u003CDependentUpon>*.dbml\u003C\u002FDependentUpon>` or `\u003CGenerator>MSLinqToSQLGenerator\u003C\u002FGenerator>` from the project file (SDK-style projects handle this automatically; old-style `.csproj` may need manual cleanup)\r\n\r\n**How to identify the DBML-generated designer file:** It is the `.designer.cs` file that has a `\u003CDependentUpon>SomeName.dbml\u003C\u002FDependentUpon>` entry in the project file, or that contains a class inheriting from `System.Data.Linq.DataContext`. Do NOT confuse it with WinForms `Form1.Designer.cs` files — those are unrelated.\r\n\r\n**Final check:** After cleanup, confirm zero `*.dbml`, `*.dbml.layout` files remain and no `System.Data.Linq` references exist anywhere in the project.\r\n\r\n## Disambiguation\r\n\r\nDo NOT apply this skill to:\r\n- `System.Linq` (LINQ to Objects) — works in modern .NET\r\n- `System.Xml.Linq` (LINQ to XML) — works in modern .NET\r\n- `System.Data.Entity` (Entity Framework 6) — separate migration skill\r\n- `LinqToDB` (linq2db) — third-party library, different migration path\r\n\r\n## Success Criteria\r\n\r\n- **New clean files created** for DbContext and entity classes (not rewritten in the old `*.designer.cs`)\r\n- **All LINQ to SQL artifacts deleted**: `*.dbml`, `*.dbml.layout`, DBML-generated `*.designer.cs`\r\n- All `System.Data.Linq` references removed from project file and code\r\n- EF Core DbContext replaces all DataContext usage\r\n- All stored procedures migrated to EF Core patterns\r\n- Navigation property loading is explicit (no silent null references)\r\n- Concurrency strategy decided and implemented\r\n- Project builds and queries execute correctly\r\n",{"data":37,"body":40},{"name":4,"description":6,"metadata":38},{"traits":39},".NET|CSharp|VisualBasic|DotNetCore",{"type":41,"children":42},"root",[43,52,59,74,83,154,160,165,206,211,217,229,236,241,246,364,369,398,404,442,448,464,528,536,631,639,690,702,735,741,753,758,921,945,956,962,975,980,1050,1068,1074,1092,1097,1182,1211,1222,1228,1241,1246,1342,1362,1373,1379,1384,1459,1470,1476,1537,1560,1566,1576,1581,1664,1735,1776,1806,1812,1817,1864,1870],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"linq-to-sql-to-entity-framework-core-migration",[49],{"type":50,"value":51},"text","LINQ to SQL to Entity Framework Core Migration",{"type":44,"tag":53,"props":54,"children":56},"h2",{"id":55},"overview",[57],{"type":50,"value":58},"Overview",{"type":44,"tag":60,"props":61,"children":62},"p",{},[63,65,72],{"type":50,"value":64},"Migrates .NET Framework projects from LINQ to SQL (",{"type":44,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":50,"value":71},"System.Data.Linq",{"type":50,"value":73},") to Entity Framework Core. LINQ to SQL is not available in .NET 6+ — this is a migration blocker, not an optional improvement.",{"type":44,"tag":60,"props":75,"children":76},{},[77],{"type":44,"tag":78,"props":79,"children":80},"strong",{},[81],{"type":50,"value":82},"Reference files for detailed patterns:",{"type":44,"tag":84,"props":85,"children":86},"ul",{},[87,99,110,121,132,143],{"type":44,"tag":88,"props":89,"children":90},"li",{},[91,97],{"type":44,"tag":66,"props":92,"children":94},{"className":93},[],[95],{"type":50,"value":96},"ref\u002Fentity-mapping-conversion.md",{"type":50,"value":98}," — DBML\u002Fattribute mapping to EF Core",{"type":44,"tag":88,"props":100,"children":101},{},[102,108],{"type":44,"tag":66,"props":103,"children":105},{"className":104},[],[106],{"type":50,"value":107},"ref\u002Fdatacontext-to-dbcontext.md",{"type":50,"value":109}," — DataContext lifecycle and API migration",{"type":44,"tag":88,"props":111,"children":112},{},[113,119],{"type":44,"tag":66,"props":114,"children":116},{"className":115},[],[117],{"type":50,"value":118},"ref\u002Fquery-translation-gotchas.md",{"type":50,"value":120}," — Query behavior differences (critical for runtime correctness)",{"type":44,"tag":88,"props":122,"children":123},{},[124,130],{"type":44,"tag":66,"props":125,"children":127},{"className":126},[],[128],{"type":50,"value":129},"ref\u002Fstored-procedure-migration.md",{"type":50,"value":131}," — SP\u002Ffunction mapping",{"type":44,"tag":88,"props":133,"children":134},{},[135,141],{"type":44,"tag":66,"props":136,"children":138},{"className":137},[],[139],{"type":50,"value":140},"ref\u002Fconcurrency-and-change-tracking.md",{"type":50,"value":142}," — UpdateCheck\u002Fconflict resolution",{"type":44,"tag":88,"props":144,"children":145},{},[146,152],{"type":44,"tag":66,"props":147,"children":149},{"className":148},[],[150],{"type":50,"value":151},"ref\u002Frelationship-migration.md",{"type":50,"value":153}," — EntitySet\u002FEntityRef to navigation properties",{"type":44,"tag":53,"props":155,"children":157},{"id":156},"prerequisites",[158],{"type":50,"value":159},"Prerequisites",{"type":44,"tag":60,"props":161,"children":162},{},[163],{"type":50,"value":164},"Verify LINQ to SQL usage before proceeding:",{"type":44,"tag":166,"props":167,"children":168},"ol",{},[169,181,194],{"type":44,"tag":88,"props":170,"children":171},{},[172,174,179],{"type":50,"value":173},"Check for ",{"type":44,"tag":66,"props":175,"children":177},{"className":176},[],[178],{"type":50,"value":71},{"type":50,"value":180}," assembly reference in the project file",{"type":44,"tag":88,"props":182,"children":183},{},[184,186,192],{"type":50,"value":185},"Search for ",{"type":44,"tag":66,"props":187,"children":189},{"className":188},[],[190],{"type":50,"value":191},".dbml",{"type":50,"value":193}," files in the project directory",{"type":44,"tag":88,"props":195,"children":196},{},[197,198,204],{"type":50,"value":185},{"type":44,"tag":66,"props":199,"children":201},{"className":200},[],[202],{"type":50,"value":203},"using System.Data.Linq",{"type":50,"value":205}," in code files",{"type":44,"tag":60,"props":207,"children":208},{},[209],{"type":50,"value":210},"If none found, skip this skill.",{"type":44,"tag":53,"props":212,"children":214},{"id":213},"workflow",[215],{"type":50,"value":216},"Workflow",{"type":44,"tag":218,"props":219,"children":223},"pre",{"className":220,"code":222,"language":50},[221],"language-text","Migration Progress:\n- [ ] Step 1: Assess LINQ to SQL usage scope\n- [ ] Step 2: Set up EF Core infrastructure\n- [ ] Step 3: Scaffold or convert entity model\n- [ ] Step 4: Migrate DataContext to DbContext\n- [ ] Step 5: Migrate stored procedures and functions\n- [ ] Step 6: Fix relationship loading patterns\n- [ ] Step 7: Migrate concurrency handling\n- [ ] Step 8: Fix query translation issues\n- [ ] Step 9: Validate\n- [ ] Step 10: Remove LINQ to SQL artifacts\n",[224],{"type":44,"tag":66,"props":225,"children":227},{"__ignoreMap":226},"",[228],{"type":50,"value":222},{"type":44,"tag":230,"props":231,"children":233},"h3",{"id":232},"step-1-assess-linq-to-sql-usage-scope",[234],{"type":50,"value":235},"Step 1: Assess LINQ to SQL Usage Scope",{"type":44,"tag":60,"props":237,"children":238},{},[239],{"type":50,"value":240},"Before making changes, inventory the full scope. This determines effort and identifies blockers.",{"type":44,"tag":60,"props":242,"children":243},{},[244],{"type":50,"value":245},"Find and count:",{"type":44,"tag":84,"props":247,"children":248},{},[249,259,280,292,305,329,348,359],{"type":44,"tag":88,"props":250,"children":251},{},[252,257],{"type":44,"tag":66,"props":253,"children":255},{"className":254},[],[256],{"type":50,"value":191},{"type":50,"value":258}," files and their entity\u002FSP counts (parse the XML)",{"type":44,"tag":88,"props":260,"children":261},{},[262,264,270,272,278],{"type":50,"value":263},"DataContext classes (search for ",{"type":44,"tag":66,"props":265,"children":267},{"className":266},[],[268],{"type":50,"value":269},": DataContext",{"type":50,"value":271}," or ",{"type":44,"tag":66,"props":273,"children":275},{"className":274},[],[276],{"type":50,"value":277},": System.Data.Linq.DataContext",{"type":50,"value":279},")",{"type":44,"tag":88,"props":281,"children":282},{},[283,285,291],{"type":50,"value":284},"DataContext instantiation points (",{"type":44,"tag":66,"props":286,"children":288},{"className":287},[],[289],{"type":50,"value":290},"new *DataContext(",{"type":50,"value":279},{"type":44,"tag":88,"props":293,"children":294},{},[295,297,303],{"type":50,"value":296},"Stored procedure mappings (",{"type":44,"tag":66,"props":298,"children":300},{"className":299},[],[301],{"type":50,"value":302},"[Function(",{"type":50,"value":304}," attribute usage)",{"type":44,"tag":88,"props":306,"children":307},{},[308,314,316,321,323,328],{"type":44,"tag":66,"props":309,"children":311},{"className":310},[],[312],{"type":50,"value":313},"IMultipleResults",{"type":50,"value":315}," usage (",{"type":44,"tag":78,"props":317,"children":318},{},[319],{"type":50,"value":320},"blocker",{"type":50,"value":322}," — no EF Core equivalent; see ",{"type":44,"tag":66,"props":324,"children":326},{"className":325},[],[327],{"type":50,"value":129},{"type":50,"value":279},{"type":44,"tag":88,"props":330,"children":331},{},[332,338,340,346],{"type":44,"tag":66,"props":333,"children":335},{"className":334},[],[336],{"type":50,"value":337},"EntitySet\u003CT>",{"type":50,"value":339}," and ",{"type":44,"tag":66,"props":341,"children":343},{"className":342},[],[344],{"type":50,"value":345},"EntityRef\u003CT>",{"type":50,"value":347}," usage counts",{"type":44,"tag":88,"props":349,"children":350},{},[351,357],{"type":44,"tag":66,"props":352,"children":354},{"className":353},[],[355],{"type":50,"value":356},"UpdateCheck.WhenChanged",{"type":50,"value":358}," usage (requires concurrency strategy decision)",{"type":44,"tag":88,"props":360,"children":361},{},[362],{"type":50,"value":363},"Partial class extensions of generated entities (business logic to preserve)",{"type":44,"tag":60,"props":365,"children":366},{},[367],{"type":50,"value":368},"Flag these blockers early:",{"type":44,"tag":84,"props":370,"children":371},{},[372,382],{"type":44,"tag":88,"props":373,"children":374},{},[375,380],{"type":44,"tag":66,"props":376,"children":378},{"className":377},[],[379],{"type":50,"value":313},{"type":50,"value":381}," → requires ADO.NET fallback or SP redesign",{"type":44,"tag":88,"props":383,"children":384},{},[385,390,392,397],{"type":44,"tag":66,"props":386,"children":388},{"className":387},[],[389],{"type":50,"value":356},{"type":50,"value":391}," → no direct EF Core equivalent (see ",{"type":44,"tag":66,"props":393,"children":395},{"className":394},[],[396],{"type":50,"value":140},{"type":50,"value":279},{"type":44,"tag":230,"props":399,"children":401},{"id":400},"step-2-set-up-ef-core-infrastructure",[402],{"type":50,"value":403},"Step 2: Set Up EF Core Infrastructure",{"type":44,"tag":166,"props":405,"children":406},{},[407,437],{"type":44,"tag":88,"props":408,"children":409},{},[410,412],{"type":50,"value":411},"Add NuGet packages:\n",{"type":44,"tag":84,"props":413,"children":414},{},[415,426],{"type":44,"tag":88,"props":416,"children":417},{},[418,424],{"type":44,"tag":66,"props":419,"children":421},{"className":420},[],[422],{"type":50,"value":423},"Microsoft.EntityFrameworkCore.SqlServer",{"type":50,"value":425}," (or appropriate provider)",{"type":44,"tag":88,"props":427,"children":428},{},[429,435],{"type":44,"tag":66,"props":430,"children":432},{"className":431},[],[433],{"type":50,"value":434},"Microsoft.EntityFrameworkCore.Design",{"type":50,"value":436}," (for tooling)",{"type":44,"tag":88,"props":438,"children":439},{},[440],{"type":50,"value":441},"Ensure the project targets .NET 6+ (should already be the case in an upgrade scenario)",{"type":44,"tag":230,"props":443,"children":445},{"id":444},"step-3-create-new-ef-core-entity-model",[446],{"type":50,"value":447},"Step 3: Create New EF Core Entity Model",{"type":44,"tag":60,"props":449,"children":450},{},[451],{"type":44,"tag":78,"props":452,"children":453},{},[454,456,462],{"type":50,"value":455},"CRITICAL: Create new files — do NOT rewrite the DBML-generated ",{"type":44,"tag":66,"props":457,"children":459},{"className":458},[],[460],{"type":50,"value":461},"*.designer.cs",{"type":50,"value":463}," file in place.",{"type":44,"tag":60,"props":465,"children":466},{},[467,469,474,476,482,484,490,492,497,498,503,504,510,512,518,520,526],{"type":50,"value":468},"The ",{"type":44,"tag":66,"props":470,"children":472},{"className":471},[],[473],{"type":50,"value":461},{"type":50,"value":475}," file (e.g., ",{"type":44,"tag":66,"props":477,"children":479},{"className":478},[],[480],{"type":50,"value":481},"CompanyDB.designer.cs",{"type":50,"value":483},") was auto-generated by the LINQ to SQL O\u002FR Designer. It is full of LINQ to SQL plumbing (",{"type":44,"tag":66,"props":485,"children":487},{"className":486},[],[488],{"type":50,"value":489},"INotifyPropertyChanging",{"type":50,"value":491},", ",{"type":44,"tag":66,"props":493,"children":495},{"className":494},[],[496],{"type":50,"value":337},{"type":50,"value":491},{"type":44,"tag":66,"props":499,"children":501},{"className":500},[],[502],{"type":50,"value":345},{"type":50,"value":491},{"type":44,"tag":66,"props":505,"children":507},{"className":506},[],[508],{"type":50,"value":509},"OnXChanging",{"type":50,"value":511},"\u002F",{"type":44,"tag":66,"props":513,"children":515},{"className":514},[],[516],{"type":50,"value":517},"OnXChanged",{"type":50,"value":519}," partial methods). Do not attempt to \"convert\" this file into EF Core entities — it will retain confusing artifacts and the ",{"type":44,"tag":66,"props":521,"children":523},{"className":522},[],[524],{"type":50,"value":525},".designer.cs",{"type":50,"value":527}," name implies auto-generation.",{"type":44,"tag":60,"props":529,"children":530},{},[531],{"type":44,"tag":78,"props":532,"children":533},{},[534],{"type":50,"value":535},"Instead, create new clean files:",{"type":44,"tag":166,"props":537,"children":538},{},[539,581,614],{"type":44,"tag":88,"props":540,"children":541},{},[542,547,549,555,557,563,565,571,573,579],{"type":44,"tag":78,"props":543,"children":544},{},[545],{"type":50,"value":546},"New DbContext file",{"type":50,"value":548}," — e.g., ",{"type":44,"tag":66,"props":550,"children":552},{"className":551},[],[553],{"type":50,"value":554},"MyDbContext.cs",{"type":50,"value":556}," (or ",{"type":44,"tag":66,"props":558,"children":560},{"className":559},[],[561],{"type":50,"value":562},"{OriginalDataContextName}DbContext.cs",{"type":50,"value":564},"). Define the ",{"type":44,"tag":66,"props":566,"children":568},{"className":567},[],[569],{"type":50,"value":570},"DbContext",{"type":50,"value":572}," subclass with ",{"type":44,"tag":66,"props":574,"children":576},{"className":575},[],[577],{"type":50,"value":578},"DbSet\u003CT>",{"type":50,"value":580}," properties here.",{"type":44,"tag":88,"props":582,"children":583},{},[584,589,591,597,598,604,606,612],{"type":44,"tag":78,"props":585,"children":586},{},[587],{"type":50,"value":588},"New entity class files",{"type":50,"value":590}," — create one file per entity class (e.g., ",{"type":44,"tag":66,"props":592,"children":594},{"className":593},[],[595],{"type":50,"value":596},"Entities\u002FCustomer.cs",{"type":50,"value":491},{"type":44,"tag":66,"props":599,"children":601},{"className":600},[],[602],{"type":50,"value":603},"Entities\u002FOrder.cs",{"type":50,"value":605},") or a single ",{"type":44,"tag":66,"props":607,"children":609},{"className":608},[],[610],{"type":50,"value":611},"Entities.cs",{"type":50,"value":613}," file for small models. Write clean POCO classes with EF Core data annotations or Fluent API configuration.",{"type":44,"tag":88,"props":615,"children":616},{},[617,622,624,629],{"type":44,"tag":78,"props":618,"children":619},{},[620],{"type":50,"value":621},"Preserve partial class logic",{"type":50,"value":623}," — if the project has partial classes extending DBML-generated entities (separate from the ",{"type":44,"tag":66,"props":625,"children":627},{"className":626},[],[628],{"type":50,"value":525},{"type":50,"value":630}," file), migrate that business logic into the new entity files.",{"type":44,"tag":60,"props":632,"children":633},{},[634],{"type":44,"tag":78,"props":635,"children":636},{},[637],{"type":50,"value":638},"Recommended approach: Scaffold first, then reconcile.",{"type":44,"tag":166,"props":640,"children":641},{},[642,655,673,678],{"type":44,"tag":88,"props":643,"children":644},{},[645,647,653],{"type":50,"value":646},"Use ",{"type":44,"tag":66,"props":648,"children":650},{"className":649},[],[651],{"type":50,"value":652},"dotnet ef dbcontext scaffold \"ConnectionString\" Microsoft.EntityFrameworkCore.SqlServer -o Entities",{"type":50,"value":654}," to generate baseline entities from the existing database into a new folder",{"type":44,"tag":88,"props":656,"children":657},{},[658,660],{"type":50,"value":659},"Compare scaffolded entities with DBML-defined entities:\n",{"type":44,"tag":84,"props":661,"children":662},{},[663,668],{"type":44,"tag":88,"props":664,"children":665},{},[666],{"type":50,"value":667},"Reconcile custom C# names from DBML (the DBML may rename entities\u002Fproperties differently from the database)",{"type":44,"tag":88,"props":669,"children":670},{},[671],{"type":50,"value":672},"Preserve custom partial class logic from existing code",{"type":44,"tag":88,"props":674,"children":675},{},[676],{"type":50,"value":677},"Apply Fluent API configuration for non-convention mappings",{"type":44,"tag":88,"props":679,"children":680},{},[681,683,688],{"type":50,"value":682},"If scaffolding is not possible (no database access), manually create entity POCOs by reading the ",{"type":44,"tag":66,"props":684,"children":686},{"className":685},[],[687],{"type":50,"value":191},{"type":50,"value":689}," XML to extract table\u002Fcolumn definitions, then translate to EF Core attributes",{"type":44,"tag":60,"props":691,"children":692},{},[693,695,700],{"type":50,"value":694},"See ",{"type":44,"tag":66,"props":696,"children":698},{"className":697},[],[699],{"type":50,"value":96},{"type":50,"value":701}," for the complete attribute mapping table and DBML conversion strategy.",{"type":44,"tag":60,"props":703,"children":704},{},[705,710,712,718,719,725,727,733],{"type":44,"tag":78,"props":706,"children":707},{},[708],{"type":50,"value":709},"Important:",{"type":50,"value":711}," During conversion, both LINQ to SQL and EF Core use ",{"type":44,"tag":66,"props":713,"children":715},{"className":714},[],[716],{"type":50,"value":717},"[Table]",{"type":50,"value":339},{"type":44,"tag":66,"props":720,"children":722},{"className":721},[],[723],{"type":50,"value":724},"[Column]",{"type":50,"value":726}," attributes from different namespaces. Use fully-qualified names or manage ",{"type":44,"tag":66,"props":728,"children":730},{"className":729},[],[731],{"type":50,"value":732},"using",{"type":50,"value":734}," directives carefully to avoid ambiguous reference errors.",{"type":44,"tag":230,"props":736,"children":738},{"id":737},"step-4-migrate-datacontext-to-dbcontext",[739],{"type":50,"value":740},"Step 4: Migrate DataContext to DbContext",{"type":44,"tag":60,"props":742,"children":743},{},[744,746,751],{"type":50,"value":745},"Replace all DataContext usage with the ",{"type":44,"tag":78,"props":747,"children":748},{},[749],{"type":50,"value":750},"new",{"type":50,"value":752}," DbContext class created in Step 3. This is not just a rename — the lifecycle model differs fundamentally.",{"type":44,"tag":60,"props":754,"children":755},{},[756],{"type":50,"value":757},"Update all consuming code to reference the new DbContext class name and the new entity types:",{"type":44,"tag":84,"props":759,"children":760},{},[761,779,804,820,836,859,890,908],{"type":44,"tag":88,"props":762,"children":763},{},[764,770,772,777],{"type":44,"tag":66,"props":765,"children":767},{"className":766},[],[768],{"type":50,"value":769},"Table\u003CT>",{"type":50,"value":771}," properties → ",{"type":44,"tag":66,"props":773,"children":775},{"className":774},[],[776],{"type":50,"value":578},{"type":50,"value":778}," properties",{"type":44,"tag":88,"props":780,"children":781},{},[782,788,790,796,798],{"type":44,"tag":66,"props":783,"children":785},{"className":784},[],[786],{"type":50,"value":787},"SubmitChanges()",{"type":50,"value":789}," → ",{"type":44,"tag":66,"props":791,"children":793},{"className":792},[],[794],{"type":50,"value":795},"SaveChanges()",{"type":50,"value":797}," \u002F ",{"type":44,"tag":66,"props":799,"children":801},{"className":800},[],[802],{"type":50,"value":803},"SaveChangesAsync()",{"type":44,"tag":88,"props":805,"children":806},{},[807,813,814],{"type":44,"tag":66,"props":808,"children":810},{"className":809},[],[811],{"type":50,"value":812},"GetChangeSet()",{"type":50,"value":789},{"type":44,"tag":66,"props":815,"children":817},{"className":816},[],[818],{"type":50,"value":819},"ChangeTracker.Entries()",{"type":44,"tag":88,"props":821,"children":822},{},[823,829,830],{"type":44,"tag":66,"props":824,"children":826},{"className":825},[],[827],{"type":50,"value":828},"ExecuteCommand()",{"type":50,"value":789},{"type":44,"tag":66,"props":831,"children":833},{"className":832},[],[834],{"type":50,"value":835},"Database.ExecuteSqlRaw()",{"type":44,"tag":88,"props":837,"children":838},{},[839,845,846,852,853],{"type":44,"tag":66,"props":840,"children":842},{"className":841},[],[843],{"type":50,"value":844},"ExecuteQuery\u003CT>()",{"type":50,"value":789},{"type":44,"tag":66,"props":847,"children":849},{"className":848},[],[850],{"type":50,"value":851},"FromSqlRaw()",{"type":50,"value":797},{"type":44,"tag":66,"props":854,"children":856},{"className":855},[],[857],{"type":50,"value":858},"SqlQueryRaw\u003CT>()",{"type":44,"tag":88,"props":860,"children":861},{},[862,868,869,875,876,882,884],{"type":44,"tag":66,"props":863,"children":865},{"className":864},[],[866],{"type":50,"value":867},"DataContext.Log",{"type":50,"value":789},{"type":44,"tag":66,"props":870,"children":872},{"className":871},[],[873],{"type":50,"value":874},"ILoggerFactory",{"type":50,"value":797},{"type":44,"tag":66,"props":877,"children":879},{"className":878},[],[880],{"type":50,"value":881},"LogTo()",{"type":50,"value":883}," on ",{"type":44,"tag":66,"props":885,"children":887},{"className":886},[],[888],{"type":50,"value":889},"DbContextOptionsBuilder",{"type":44,"tag":88,"props":891,"children":892},{},[893,899,900,906],{"type":44,"tag":66,"props":894,"children":896},{"className":895},[],[897],{"type":50,"value":898},"ObjectTrackingEnabled = false",{"type":50,"value":789},{"type":44,"tag":66,"props":901,"children":903},{"className":902},[],[904],{"type":50,"value":905},"AsNoTracking()",{"type":50,"value":907}," queries",{"type":44,"tag":88,"props":909,"children":910},{},[911,913,919],{"type":50,"value":912},"Direct instantiation (",{"type":44,"tag":66,"props":914,"children":916},{"className":915},[],[917],{"type":50,"value":918},"new MyDataContext(conn)",{"type":50,"value":920},") → DI-injected DbContext",{"type":44,"tag":60,"props":922,"children":923},{},[924,929,931,936,938,943],{"type":44,"tag":78,"props":925,"children":926},{},[927],{"type":50,"value":928},"Critical:",{"type":50,"value":930}," If DataContext was used in ",{"type":44,"tag":66,"props":932,"children":934},{"className":933},[],[935],{"type":50,"value":732},{"type":50,"value":937}," blocks and you migrate to DI-managed DbContext (scoped lifetime), remove the ",{"type":44,"tag":66,"props":939,"children":941},{"className":940},[],[942],{"type":50,"value":732},{"type":50,"value":944}," blocks — the DI container manages disposal. Keeping both causes premature disposal.",{"type":44,"tag":60,"props":946,"children":947},{},[948,949,954],{"type":50,"value":694},{"type":44,"tag":66,"props":950,"children":952},{"className":951},[],[953],{"type":50,"value":107},{"type":50,"value":955}," for detailed API mappings and lifecycle patterns.",{"type":44,"tag":230,"props":957,"children":959},{"id":958},"step-5-migrate-stored-procedures-and-functions",[960],{"type":50,"value":961},"Step 5: Migrate Stored Procedures and Functions",{"type":44,"tag":60,"props":963,"children":964},{},[965,967,973],{"type":50,"value":966},"LINQ to SQL maps SPs as methods on DataContext with ",{"type":44,"tag":66,"props":968,"children":970},{"className":969},[],[971],{"type":50,"value":972},"[Function]",{"type":50,"value":974}," attributes. EF Core has no attribute-based SP mapping.",{"type":44,"tag":60,"props":976,"children":977},{},[978],{"type":50,"value":979},"For each stored procedure:",{"type":44,"tag":84,"props":981,"children":982},{},[983,994,1004,1024,1037],{"type":44,"tag":88,"props":984,"children":985},{},[986,988],{"type":50,"value":987},"SPs returning entity types → ",{"type":44,"tag":66,"props":989,"children":991},{"className":990},[],[992],{"type":50,"value":993},"FromSqlRaw(\"EXEC sp_name @p0, @p1\", params)",{"type":44,"tag":88,"props":995,"children":996},{},[997,999],{"type":50,"value":998},"SPs with no return → ",{"type":44,"tag":66,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":50,"value":835},{"type":44,"tag":88,"props":1005,"children":1006},{},[1007,1009,1014,1016,1022],{"type":50,"value":1008},"SPs with non-entity results → ",{"type":44,"tag":66,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":50,"value":858},{"type":50,"value":1015}," (EF Core 8+) with ",{"type":44,"tag":66,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":50,"value":1021},"[Keyless]",{"type":50,"value":1023}," result types",{"type":44,"tag":88,"props":1025,"children":1026},{},[1027,1029,1035],{"type":50,"value":1028},"SPs with output parameters → use ",{"type":44,"tag":66,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":50,"value":1034},"SqlParameter",{"type":50,"value":1036}," objects directly",{"type":44,"tag":88,"props":1038,"children":1039},{},[1040,1042,1048],{"type":50,"value":1041},"UDFs → ",{"type":44,"tag":66,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":50,"value":1047},"HasDbFunction()",{"type":50,"value":1049}," in Fluent API",{"type":44,"tag":60,"props":1051,"children":1052},{},[1053,1054,1059,1061,1066],{"type":50,"value":694},{"type":44,"tag":66,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":50,"value":129},{"type":50,"value":1060}," for complete patterns and the ",{"type":44,"tag":66,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":50,"value":313},{"type":50,"value":1067}," blocker.",{"type":44,"tag":230,"props":1069,"children":1071},{"id":1070},"step-6-fix-relationship-loading-patterns",[1072],{"type":50,"value":1073},"Step 6: Fix Relationship Loading Patterns",{"type":44,"tag":60,"props":1075,"children":1076},{},[1077,1079,1084,1085,1090],{"type":50,"value":1078},"LINQ to SQL lazy-loads via ",{"type":44,"tag":66,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":50,"value":337},{"type":50,"value":797},{"type":44,"tag":66,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":50,"value":345},{"type":50,"value":1091}," by default. EF Core does NOT lazy-load by default.",{"type":44,"tag":60,"props":1093,"children":1094},{},[1095],{"type":50,"value":1096},"This is the highest-risk area for subtle runtime bugs:",{"type":44,"tag":166,"props":1098,"children":1099},{},[1100,1117,1128,1153,1170],{"type":44,"tag":88,"props":1101,"children":1102},{},[1103,1105,1110,1111],{"type":50,"value":1104},"Replace ",{"type":44,"tag":66,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":50,"value":337},{"type":50,"value":789},{"type":44,"tag":66,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":50,"value":1116},"ICollection\u003CT>",{"type":44,"tag":88,"props":1118,"children":1119},{},[1120,1121,1126],{"type":50,"value":1104},{"type":44,"tag":66,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":50,"value":345},{"type":50,"value":1127}," → standard navigation property",{"type":44,"tag":88,"props":1129,"children":1130},{},[1131,1136,1138,1144,1145,1151],{"type":44,"tag":78,"props":1132,"children":1133},{},[1134],{"type":50,"value":1135},"Find all navigation property access patterns",{"type":50,"value":1137}," and add ",{"type":44,"tag":66,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":50,"value":1143},"Include()",{"type":50,"value":797},{"type":44,"tag":66,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":50,"value":1150},"ThenInclude()",{"type":50,"value":1152}," calls",{"type":44,"tag":88,"props":1154,"children":1155},{},[1156,1158,1164,1165],{"type":50,"value":1157},"Convert ",{"type":44,"tag":66,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":50,"value":1163},"DataLoadOptions.LoadWith\u003CT>()",{"type":50,"value":789},{"type":44,"tag":66,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":50,"value":1143},{"type":44,"tag":88,"props":1171,"children":1172},{},[1173,1174,1180],{"type":50,"value":1157},{"type":44,"tag":66,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":50,"value":1179},"DataLoadOptions.AssociateWith\u003CT>()",{"type":50,"value":1181}," → filtered includes",{"type":44,"tag":60,"props":1183,"children":1184},{},[1185,1187,1193,1195,1201,1203,1209],{"type":50,"value":1186},"Code that worked before (",{"type":44,"tag":66,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":50,"value":1192},"order.Customer.Name",{"type":50,"value":1194},") will return ",{"type":44,"tag":66,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":50,"value":1200},"null",{"type":50,"value":1202}," \u002F throw ",{"type":44,"tag":66,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":50,"value":1208},"NullReferenceException",{"type":50,"value":1210}," without explicit loading.",{"type":44,"tag":60,"props":1212,"children":1213},{},[1214,1215,1220],{"type":50,"value":694},{"type":44,"tag":66,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":50,"value":151},{"type":50,"value":1221}," for detailed patterns.",{"type":44,"tag":230,"props":1223,"children":1225},{"id":1224},"step-7-migrate-concurrency-handling",[1226],{"type":50,"value":1227},"Step 7: Migrate Concurrency Handling",{"type":44,"tag":60,"props":1229,"children":1230},{},[1231,1233,1239],{"type":50,"value":1232},"If the project uses ",{"type":44,"tag":66,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":50,"value":1238},"UpdateCheck",{"type":50,"value":1240}," attributes on columns, a concurrency strategy decision is needed.",{"type":44,"tag":60,"props":1242,"children":1243},{},[1244],{"type":50,"value":1245},"Decision tree:",{"type":44,"tag":166,"props":1247,"children":1248},{},[1249,1277,1302,1326],{"type":44,"tag":88,"props":1250,"children":1251},{},[1252,1254,1260,1261,1267,1269,1275],{"type":50,"value":1253},"Project uses ",{"type":44,"tag":66,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":50,"value":1259},"rowversion",{"type":50,"value":511},{"type":44,"tag":66,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":50,"value":1266},"timestamp",{"type":50,"value":1268}," column → use ",{"type":44,"tag":66,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":50,"value":1274},"[Timestamp]",{"type":50,"value":1276}," attribute (straightforward)",{"type":44,"tag":88,"props":1278,"children":1279},{},[1280,1281,1287,1289,1294,1296],{"type":50,"value":1253},{"type":44,"tag":66,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":50,"value":1286},"UpdateCheck.Always",{"type":50,"value":1288}," on all columns → add a ",{"type":44,"tag":66,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":50,"value":1259},{"type":50,"value":1295}," column (recommended) or use ",{"type":44,"tag":66,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":50,"value":1301},"[ConcurrencyCheck]",{"type":44,"tag":88,"props":1303,"children":1304},{},[1305,1306,1311,1312,1317,1319,1324],{"type":50,"value":1253},{"type":44,"tag":66,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":50,"value":356},{"type":50,"value":789},{"type":44,"tag":78,"props":1313,"children":1314},{},[1315],{"type":50,"value":1316},"no direct equivalent",{"type":50,"value":1318}," — recommend adding ",{"type":44,"tag":66,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":50,"value":1259},{"type":50,"value":1325}," column",{"type":44,"tag":88,"props":1327,"children":1328},{},[1329,1335,1337],{"type":44,"tag":66,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":50,"value":1334},"UpdateCheck.Never",{"type":50,"value":1336}," → those columns simply don't get ",{"type":44,"tag":66,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":50,"value":1301},{"type":44,"tag":60,"props":1343,"children":1344},{},[1345,1347,1353,1354,1360],{"type":50,"value":1346},"Also migrate conflict resolution: ",{"type":44,"tag":66,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":50,"value":1352},"ChangeConflictException",{"type":50,"value":789},{"type":44,"tag":66,"props":1355,"children":1357},{"className":1356},[],[1358],{"type":50,"value":1359},"DbUpdateConcurrencyException",{"type":50,"value":1361}," (different resolution API).",{"type":44,"tag":60,"props":1363,"children":1364},{},[1365,1366,1371],{"type":50,"value":694},{"type":44,"tag":66,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":50,"value":140},{"type":50,"value":1372}," for the complete decision tree and API mappings.",{"type":44,"tag":230,"props":1374,"children":1376},{"id":1375},"step-8-fix-query-translation-issues",[1377],{"type":50,"value":1378},"Step 8: Fix Query Translation Issues",{"type":44,"tag":60,"props":1380,"children":1381},{},[1382],{"type":50,"value":1383},"EF Core is stricter than LINQ to SQL about query translation. The #1 source of runtime breaks:",{"type":44,"tag":84,"props":1385,"children":1386},{},[1387,1405,1415,1431,1441],{"type":44,"tag":88,"props":1388,"children":1389},{},[1390,1395,1397,1403],{"type":44,"tag":78,"props":1391,"children":1392},{},[1393],{"type":50,"value":1394},"Client-side evaluation",{"type":50,"value":1396},": LINQ to SQL silently evaluated untranslatable expressions client-side. EF Core throws. Add ",{"type":44,"tag":66,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":50,"value":1402},".AsEnumerable()",{"type":50,"value":1404}," before client-side operations.",{"type":44,"tag":88,"props":1406,"children":1407},{},[1408,1413],{"type":44,"tag":78,"props":1409,"children":1410},{},[1411],{"type":50,"value":1412},"GroupBy",{"type":50,"value":1414},": Complex GroupBy with materialization fails in EF Core",{"type":44,"tag":88,"props":1416,"children":1417},{},[1418,1423,1425],{"type":44,"tag":78,"props":1419,"children":1420},{},[1421],{"type":50,"value":1422},"Take\u002FSkip without OrderBy",{"type":50,"value":1424},": EF Core requires explicit ",{"type":44,"tag":66,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":50,"value":1430},"OrderBy",{"type":44,"tag":88,"props":1432,"children":1433},{},[1434,1439],{"type":44,"tag":78,"props":1435,"children":1436},{},[1437],{"type":50,"value":1438},"String comparison",{"type":50,"value":1440},": Case-sensitivity may differ by provider",{"type":44,"tag":88,"props":1442,"children":1443},{},[1444,1449,1451,1457],{"type":44,"tag":78,"props":1445,"children":1446},{},[1447],{"type":50,"value":1448},"CompiledQuery",{"type":50,"value":1450},": Remove ",{"type":44,"tag":66,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":50,"value":1456},"CompiledQuery.Compile()",{"type":50,"value":1458}," calls — EF Core handles compilation automatically",{"type":44,"tag":60,"props":1460,"children":1461},{},[1462,1463,1468],{"type":50,"value":694},{"type":44,"tag":66,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":50,"value":118},{"type":50,"value":1469}," for the complete list.",{"type":44,"tag":230,"props":1471,"children":1473},{"id":1472},"step-9-validate",[1474],{"type":50,"value":1475},"Step 9: Validate",{"type":44,"tag":166,"props":1477,"children":1478},{},[1479,1484,1496,1522,1527,1532],{"type":44,"tag":88,"props":1480,"children":1481},{},[1482],{"type":50,"value":1483},"Build all affected projects — zero errors required",{"type":44,"tag":88,"props":1485,"children":1486},{},[1487,1489,1494],{"type":50,"value":1488},"Search for remaining ",{"type":44,"tag":66,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":50,"value":71},{"type":50,"value":1495}," references in code",{"type":44,"tag":88,"props":1497,"children":1498},{},[1499,1500,1506,1507,1513,1514,1520],{"type":50,"value":1488},{"type":44,"tag":66,"props":1501,"children":1503},{"className":1502},[],[1504],{"type":50,"value":1505},"DataContext",{"type":50,"value":491},{"type":44,"tag":66,"props":1508,"children":1510},{"className":1509},[],[1511],{"type":50,"value":1512},"EntitySet",{"type":50,"value":491},{"type":44,"tag":66,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":50,"value":1519},"EntityRef",{"type":50,"value":1521}," type usage",{"type":44,"tag":88,"props":1523,"children":1524},{},[1525],{"type":50,"value":1526},"Verify navigation property loading works (test queries that traverse relationships)",{"type":44,"tag":88,"props":1528,"children":1529},{},[1530],{"type":50,"value":1531},"Verify stored procedure calls work",{"type":44,"tag":88,"props":1533,"children":1534},{},[1535],{"type":50,"value":1536},"Verify concurrency conflict handling works",{"type":44,"tag":60,"props":1538,"children":1539},{},[1540,1545,1547,1552,1553,1558],{"type":44,"tag":78,"props":1541,"children":1542},{},[1543],{"type":50,"value":1544},"Only proceed to Step 10 after validation passes.",{"type":50,"value":1546}," The old ",{"type":44,"tag":66,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":50,"value":191},{"type":50,"value":339},{"type":44,"tag":66,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":50,"value":525},{"type":50,"value":1559}," files are useful as a reference if you need to fix issues found during validation.",{"type":44,"tag":230,"props":1561,"children":1563},{"id":1562},"step-10-remove-linq-to-sql-artifacts",[1564],{"type":50,"value":1565},"Step 10: Remove LINQ to SQL Artifacts",{"type":44,"tag":60,"props":1567,"children":1568},{},[1569,1574],{"type":44,"tag":78,"props":1570,"children":1571},{},[1572],{"type":50,"value":1573},"MANDATORY — do not skip this step.",{"type":50,"value":1575}," LINQ to SQL artifacts serve no purpose after migration and will confuse future developers.",{"type":44,"tag":60,"props":1577,"children":1578},{},[1579],{"type":50,"value":1580},"Delete these files (verify each exists before deleting):",{"type":44,"tag":166,"props":1582,"children":1583},{},[1584,1598,1612],{"type":44,"tag":88,"props":1585,"children":1586},{},[1587,1596],{"type":44,"tag":78,"props":1588,"children":1589},{},[1590],{"type":44,"tag":66,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":50,"value":1595},"*.dbml",{"type":50,"value":1597}," files — the LINQ to SQL O\u002FR Designer model definition (XML). Not used by EF Core.",{"type":44,"tag":88,"props":1599,"children":1600},{},[1601,1610],{"type":44,"tag":78,"props":1602,"children":1603},{},[1604],{"type":44,"tag":66,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":50,"value":1609},"*.dbml.layout",{"type":50,"value":1611}," files — Visual Studio designer UI layout. Not used by EF Core.",{"type":44,"tag":88,"props":1613,"children":1614},{},[1615,1625,1627,1640,1642,1647,1649,1655,1657,1662],{"type":44,"tag":78,"props":1616,"children":1617},{},[1618,1620],{"type":50,"value":1619},"DBML-generated ",{"type":44,"tag":66,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":50,"value":461},{"type":50,"value":1626}," files — the auto-generated DataContext and entity classes. These must have been replaced by new clean files in Step 3. ",{"type":44,"tag":78,"props":1628,"children":1629},{},[1630,1632,1638],{"type":50,"value":1631},"Do NOT delete WinForms\u002FWPF ",{"type":44,"tag":66,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":50,"value":1637},"*.Designer.cs",{"type":50,"value":1639}," files",{"type":50,"value":1641}," — only the one that was generated from the ",{"type":44,"tag":66,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":50,"value":191},{"type":50,"value":1648}," (typically named ",{"type":44,"tag":66,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":50,"value":1654},"{DbmlName}.designer.cs",{"type":50,"value":1656}," and containing ",{"type":44,"tag":66,"props":1658,"children":1660},{"className":1659},[],[1661],{"type":50,"value":1505},{"type":50,"value":1663}," inheritance).",{"type":44,"tag":60,"props":1665,"children":1666},{},[1667,1669,1674,1676,1682,1684,1689,1690,1696,1698,1704,1705,1711,1713,1719,1720,1726,1728,1733],{"type":50,"value":1668},"Then clean up remaining references:\n4. Remove ",{"type":44,"tag":66,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":50,"value":71},{"type":50,"value":1675}," assembly reference from the project file (",{"type":44,"tag":66,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":50,"value":1681},".csproj",{"type":50,"value":1683},")\n5. Remove ",{"type":44,"tag":66,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":50,"value":203},{"type":50,"value":339},{"type":44,"tag":66,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":50,"value":1695},"using System.Data.Linq.Mapping",{"type":50,"value":1697}," statements from all code files\n6. Remove any ",{"type":44,"tag":66,"props":1699,"children":1701},{"className":1700},[],[1702],{"type":50,"value":1703},"\u003CNone Include=\"*.dbml\">",{"type":50,"value":271},{"type":44,"tag":66,"props":1706,"children":1708},{"className":1707},[],[1709],{"type":50,"value":1710},"\u003CCompile Include=\"*.designer.cs\">",{"type":50,"value":1712}," entries with ",{"type":44,"tag":66,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":50,"value":1718},"\u003CDependentUpon>*.dbml\u003C\u002FDependentUpon>",{"type":50,"value":271},{"type":44,"tag":66,"props":1721,"children":1723},{"className":1722},[],[1724],{"type":50,"value":1725},"\u003CGenerator>MSLinqToSQLGenerator\u003C\u002FGenerator>",{"type":50,"value":1727}," from the project file (SDK-style projects handle this automatically; old-style ",{"type":44,"tag":66,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":50,"value":1681},{"type":50,"value":1734}," may need manual cleanup)",{"type":44,"tag":60,"props":1736,"children":1737},{},[1738,1743,1745,1750,1752,1758,1760,1766,1768,1774],{"type":44,"tag":78,"props":1739,"children":1740},{},[1741],{"type":50,"value":1742},"How to identify the DBML-generated designer file:",{"type":50,"value":1744}," It is the ",{"type":44,"tag":66,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":50,"value":525},{"type":50,"value":1751}," file that has a ",{"type":44,"tag":66,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":50,"value":1757},"\u003CDependentUpon>SomeName.dbml\u003C\u002FDependentUpon>",{"type":50,"value":1759}," entry in the project file, or that contains a class inheriting from ",{"type":44,"tag":66,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":50,"value":1765},"System.Data.Linq.DataContext",{"type":50,"value":1767},". Do NOT confuse it with WinForms ",{"type":44,"tag":66,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":50,"value":1773},"Form1.Designer.cs",{"type":50,"value":1775}," files — those are unrelated.",{"type":44,"tag":60,"props":1777,"children":1778},{},[1779,1784,1786,1791,1792,1797,1799,1804],{"type":44,"tag":78,"props":1780,"children":1781},{},[1782],{"type":50,"value":1783},"Final check:",{"type":50,"value":1785}," After cleanup, confirm zero ",{"type":44,"tag":66,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":50,"value":1595},{"type":50,"value":491},{"type":44,"tag":66,"props":1793,"children":1795},{"className":1794},[],[1796],{"type":50,"value":1609},{"type":50,"value":1798}," files remain and no ",{"type":44,"tag":66,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":50,"value":71},{"type":50,"value":1805}," references exist anywhere in the project.",{"type":44,"tag":53,"props":1807,"children":1809},{"id":1808},"disambiguation",[1810],{"type":50,"value":1811},"Disambiguation",{"type":44,"tag":60,"props":1813,"children":1814},{},[1815],{"type":50,"value":1816},"Do NOT apply this skill to:",{"type":44,"tag":84,"props":1818,"children":1819},{},[1820,1831,1842,1853],{"type":44,"tag":88,"props":1821,"children":1822},{},[1823,1829],{"type":44,"tag":66,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":50,"value":1828},"System.Linq",{"type":50,"value":1830}," (LINQ to Objects) — works in modern .NET",{"type":44,"tag":88,"props":1832,"children":1833},{},[1834,1840],{"type":44,"tag":66,"props":1835,"children":1837},{"className":1836},[],[1838],{"type":50,"value":1839},"System.Xml.Linq",{"type":50,"value":1841}," (LINQ to XML) — works in modern .NET",{"type":44,"tag":88,"props":1843,"children":1844},{},[1845,1851],{"type":44,"tag":66,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":50,"value":1850},"System.Data.Entity",{"type":50,"value":1852}," (Entity Framework 6) — separate migration skill",{"type":44,"tag":88,"props":1854,"children":1855},{},[1856,1862],{"type":44,"tag":66,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":50,"value":1861},"LinqToDB",{"type":50,"value":1863}," (linq2db) — third-party library, different migration path",{"type":44,"tag":53,"props":1865,"children":1867},{"id":1866},"success-criteria",[1868],{"type":50,"value":1869},"Success Criteria",{"type":44,"tag":84,"props":1871,"children":1872},{},[1873,1889,1917,1929,1934,1939,1944,1949],{"type":44,"tag":88,"props":1874,"children":1875},{},[1876,1881,1883,1888],{"type":44,"tag":78,"props":1877,"children":1878},{},[1879],{"type":50,"value":1880},"New clean files created",{"type":50,"value":1882}," for DbContext and entity classes (not rewritten in the old ",{"type":44,"tag":66,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":50,"value":461},{"type":50,"value":279},{"type":44,"tag":88,"props":1890,"children":1891},{},[1892,1897,1899,1904,1905,1910,1912],{"type":44,"tag":78,"props":1893,"children":1894},{},[1895],{"type":50,"value":1896},"All LINQ to SQL artifacts deleted",{"type":50,"value":1898},": ",{"type":44,"tag":66,"props":1900,"children":1902},{"className":1901},[],[1903],{"type":50,"value":1595},{"type":50,"value":491},{"type":44,"tag":66,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":50,"value":1609},{"type":50,"value":1911},", DBML-generated ",{"type":44,"tag":66,"props":1913,"children":1915},{"className":1914},[],[1916],{"type":50,"value":461},{"type":44,"tag":88,"props":1918,"children":1919},{},[1920,1922,1927],{"type":50,"value":1921},"All ",{"type":44,"tag":66,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":50,"value":71},{"type":50,"value":1928}," references removed from project file and code",{"type":44,"tag":88,"props":1930,"children":1931},{},[1932],{"type":50,"value":1933},"EF Core DbContext replaces all DataContext usage",{"type":44,"tag":88,"props":1935,"children":1936},{},[1937],{"type":50,"value":1938},"All stored procedures migrated to EF Core patterns",{"type":44,"tag":88,"props":1940,"children":1941},{},[1942],{"type":50,"value":1943},"Navigation property loading is explicit (no silent null references)",{"type":44,"tag":88,"props":1945,"children":1946},{},[1947],{"type":50,"value":1948},"Concurrency strategy decided and implemented",{"type":44,"tag":88,"props":1950,"children":1951},{},[1952],{"type":50,"value":1953},"Project builds and queries execute correctly",{"items":1955,"total":2051},[1956,1966,1980,1997,2007,2022,2037],{"slug":1957,"name":1957,"fn":1958,"description":1959,"org":1960,"tags":1961,"stars":26,"repoUrl":27,"updatedAt":1965},"converting-to-cpm","migrate .NET projects to Central Package Management","Converts .NET projects and solutions to NuGet Central Package Management (CPM) with Directory.Packages.props. Use when the user wants to centralize, convert, align, or sync NuGet package versions across multiple projects, resolve version conflicts or mismatches, or get versions consistent across a solution or repository. Also triggers when packages are out of sync or drifting across projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1962,1963,1964],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-18T05:14:13.971821",{"slug":1967,"name":1967,"fn":1968,"description":1969,"org":1970,"tags":1971,"stars":26,"repoUrl":27,"updatedAt":1979},"creating-winforms-custom-controls","create custom WinForms controls","Creates custom controls and UserControls for modern WinForms (.NET 6+). Use when deriving from Control, UserControl, Button, TextBox, or other base controls, implementing custom rendering with OnPaint overrides, creating composite controls with child control composition, adding custom properties with [Browsable], [Category], or [DefaultValue] attributes for Designer support, implementing INotifyPropertyChanged for control properties, handling Layout\u002FLayoutEngine for custom sizing, creating scrollable controls with AutoScrollMinSize, implementing dark mode theming, or building List\u002FGrid\u002FTree-like controls. Also triggers for \"custom UserControl\", \"derive from Control\", \"owner-drawn control\", \"Designer properties\", \"[Browsable] attribute\", \"custom WinForms control\", \"LayoutEngine\", \"AutoScroll control\", and \"themed control\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1972,1973,1976],{"name":13,"slug":14,"type":15},{"name":1974,"slug":1975,"type":15},"Windows","windows",{"name":1977,"slug":1978,"type":15},"WinUI","winui","2026-07-03T16:31:30.1325",{"slug":1981,"name":1981,"fn":1982,"description":1983,"org":1984,"tags":1985,"stars":26,"repoUrl":27,"updatedAt":1996},"managing-winforms-high-dpi-layout","design high-DPI responsive WinForms layouts","Implements WinForms high-DPI fluent layouts using TableLayoutPanel, FlowLayoutPanel, and DPI-aware design patterns. Use when creating responsive form layouts that must scale across different DPI settings, implementing Per Monitor V2 (PerMonitorV2) DPI awareness, working with TableLayoutPanel.RowStyles\u002FColumnStyles, using FlowLayoutPanel for dynamic layouts, replacing fixed pixel positioning with container-based layout, troubleshooting DPI scaling issues, or structuring nested layout containers. Also triggers for \"TableLayoutPanel\", \"FlowLayoutPanel\", \"high DPI WinForms\", \"PerMonitorV2\", \"DPI aware layout\", \"responsive WinForms\", \"scale UI\", \"AutoScaleMode\", and \"DPI scaling\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1986,1989,1992,1995],{"name":1987,"slug":1988,"type":15},"Design","design",{"name":1990,"slug":1991,"type":15},"Desktop","desktop",{"name":1993,"slug":1994,"type":15},"UI Components","ui-components",{"name":1974,"slug":1975,"type":15},"2026-07-18T05:14:12.982806",{"slug":1998,"name":1998,"fn":1999,"description":2000,"org":2001,"tags":2002,"stars":26,"repoUrl":27,"updatedAt":2006},"managing-winforms-mvvm","implement MVVM pattern in WinForms","Implements MVVM pattern in WinForms applications (.NET 8+) with ViewModels, Commands, and DataContext. Use when user explicitly requests MVVM implementation, setting up ViewModel with INotifyPropertyChanged or ObservableObject, implementing ICommand or RelayCommand, wiring Form.DataContext, binding controls to ViewModel properties, creating Commands for button clicks, or separating business logic from UI code. Also triggers for \"WinForms MVVM\", \"ViewModel in WinForms\", \"INotifyPropertyChanged\", \"DataContext binding\", \"Command pattern WinForms\", \"ObservableObject\", \"RelayCommand\", and \"testable WinForms\". Also use when fixing existing MVVM code or when guided by winforms-feature-adoption scenario. DO NOT USE FOR: automatic application during version upgrades (opt-in only).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2003,2004,2005],{"name":13,"slug":14,"type":15},{"name":1974,"slug":1975,"type":15},{"name":1977,"slug":1978,"type":15},"2026-07-18T05:14:11.951511",{"slug":2008,"name":2008,"fn":2009,"description":2010,"org":2011,"tags":2012,"stars":26,"repoUrl":27,"updatedAt":2021},"migrating-aspnet-framework-to-core","migrate ASP.NET Framework to Core","Orchestrates migration of ASP.NET Framework (System.Web) MVC and WebAPI projects to ASP.NET Core. Covers only old .NET Framework web projects — not applicable to ASP.NET Core or modern .NET web projects (those are already on the target stack). Defines the ordered phase sequence (project file, host, config, DI, controllers, middleware, auth, views, cleanup), satellite skill dispatch, and migration unit breakdown for both in-place and side-by-side modes. Use when executing a task that upgrades a project with System.Web dependencies, HttpModules, HttpHandlers, MVC controllers, WebAPI controllers, or Global.asax. Also triggers for \"migrate ASP.NET to Core\", \"upgrade MVC project\", \"convert WebAPI to ASP.NET Core\". Not applicable to class libraries unless they directly reference System.Web.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2013,2014,2017,2020],{"name":13,"slug":14,"type":15},{"name":2015,"slug":2016,"type":15},"ASP.NET Core","asp-net-core",{"name":2018,"slug":2019,"type":15},"Backend","backend",{"name":21,"slug":22,"type":15},"2026-07-03T16:30:55.581898",{"slug":2023,"name":2023,"fn":2024,"description":2025,"org":2026,"tags":2027,"stars":26,"repoUrl":27,"updatedAt":2036},"migrating-documentdb-to-cosmos","migrate DocumentDB to Cosmos DB","Migrates from the deprecated Microsoft.Azure.DocumentDB SDK (V2) to the modern Microsoft.Azure.Cosmos SDK (V3) for Azure Cosmos DB. Use ONLY when Microsoft.Azure.DocumentDB has been flagged as deprecated or obsolete and must be replaced — not for version-bump scenarios where the V2 SDK is still supported.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2028,2031,2034,2035],{"name":2029,"slug":2030,"type":15},"Azure","azure",{"name":2032,"slug":2033,"type":15},"Cosmos DB","cosmos-db",{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},"2026-07-03T16:31:21.932144",{"slug":2038,"name":2038,"fn":2039,"description":2040,"org":2041,"tags":2042,"stars":26,"repoUrl":27,"updatedAt":2050},"migrating-global-asax","migrate Global.asax to ASP.NET Core middleware","Migrates Global.asax application lifecycle events to ASP.NET Core middleware, startup configuration, and Program.cs. Use when upgrading ASP.NET Framework apps containing Global.asax or Global.asax.cs files. Triggers for \"migrate Global.asax\", \"convert application events\", \"move Application_Start to Program.cs\", \"replace Global.asax with middleware\", and ASP.NET-to-Core migration involving request lifecycle, error handling, or session management.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2043,2045,2046,2047],{"name":2015,"slug":2044,"type":15},"aspnet-core",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":2048,"slug":2049,"type":15},"Modernization","modernization","2026-07-07T06:54:34.226435",19,{"items":2053,"total":2240},[2054,2076,2093,2114,2129,2146,2157,2170,2185,2200,2215,2228],{"slug":2055,"name":2055,"fn":2056,"description":2057,"org":2058,"tags":2059,"stars":2073,"repoUrl":2074,"updatedAt":2075},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2060,2063,2066,2067,2070],{"name":2061,"slug":2062,"type":15},"Engineering","engineering",{"name":2064,"slug":2065,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":2068,"slug":2069,"type":15},"Project Management","project-management",{"name":2071,"slug":2072,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":2077,"name":2077,"fn":2078,"description":2079,"org":2080,"tags":2081,"stars":2090,"repoUrl":2091,"updatedAt":2092},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2082,2083,2086,2087],{"name":13,"slug":14,"type":15},{"name":2084,"slug":2085,"type":15},"Agents","agents",{"name":2029,"slug":2030,"type":15},{"name":2088,"slug":2089,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":2094,"name":2094,"fn":2095,"description":2096,"org":2097,"tags":2098,"stars":2090,"repoUrl":2091,"updatedAt":2113},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2099,2102,2103,2106,2109,2110],{"name":2100,"slug":2101,"type":15},"Analytics","analytics",{"name":2029,"slug":2030,"type":15},{"name":2104,"slug":2105,"type":15},"Data Analysis","data-analysis",{"name":2107,"slug":2108,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":2111,"slug":2112,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":2115,"name":2115,"fn":2116,"description":2117,"org":2118,"tags":2119,"stars":2090,"repoUrl":2091,"updatedAt":2128},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2120,2123,2124,2125],{"name":2121,"slug":2122,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2029,"slug":2030,"type":15},{"name":2107,"slug":2108,"type":15},{"name":2126,"slug":2127,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":2130,"name":2130,"fn":2131,"description":2132,"org":2133,"tags":2134,"stars":2090,"repoUrl":2091,"updatedAt":2145},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2135,2136,2139,2140,2141,2144],{"name":2029,"slug":2030,"type":15},{"name":2137,"slug":2138,"type":15},"Compliance","compliance",{"name":2088,"slug":2089,"type":15},{"name":9,"slug":8,"type":15},{"name":2142,"slug":2143,"type":15},"Python","python",{"name":2126,"slug":2127,"type":15},"2026-07-18T05:14:23.017504",{"slug":2147,"name":2147,"fn":2148,"description":2149,"org":2150,"tags":2151,"stars":2090,"repoUrl":2091,"updatedAt":2156},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2152,2153,2154,2155],{"name":2100,"slug":2101,"type":15},{"name":2029,"slug":2030,"type":15},{"name":2088,"slug":2089,"type":15},{"name":2142,"slug":2143,"type":15},"2026-07-31T05:54:29.068751",{"slug":2158,"name":2158,"fn":2159,"description":2160,"org":2161,"tags":2162,"stars":2090,"repoUrl":2091,"updatedAt":2169},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2163,2166,2167,2168],{"name":2164,"slug":2165,"type":15},"API Development","api-development",{"name":2029,"slug":2030,"type":15},{"name":9,"slug":8,"type":15},{"name":2142,"slug":2143,"type":15},"2026-07-18T05:14:16.988376",{"slug":2171,"name":2171,"fn":2172,"description":2173,"org":2174,"tags":2175,"stars":2090,"repoUrl":2091,"updatedAt":2184},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2176,2177,2180,2183],{"name":2029,"slug":2030,"type":15},{"name":2178,"slug":2179,"type":15},"Computer Vision","computer-vision",{"name":2181,"slug":2182,"type":15},"Images","images",{"name":2142,"slug":2143,"type":15},"2026-07-18T05:14:18.007737",{"slug":2186,"name":2186,"fn":2187,"description":2188,"org":2189,"tags":2190,"stars":2090,"repoUrl":2091,"updatedAt":2199},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2191,2192,2195,2198],{"name":2029,"slug":2030,"type":15},{"name":2193,"slug":2194,"type":15},"Configuration","configuration",{"name":2196,"slug":2197,"type":15},"Feature Flags","feature-flags",{"name":2107,"slug":2108,"type":15},"2026-07-03T16:32:01.278468",{"slug":2201,"name":2201,"fn":2202,"description":2203,"org":2204,"tags":2205,"stars":2090,"repoUrl":2091,"updatedAt":2214},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2206,2207,2208,2211],{"name":2032,"slug":2033,"type":15},{"name":18,"slug":19,"type":15},{"name":2209,"slug":2210,"type":15},"NoSQL","nosql",{"name":2212,"slug":2213,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":2216,"name":2216,"fn":2202,"description":2217,"org":2218,"tags":2219,"stars":2090,"repoUrl":2091,"updatedAt":2227},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2220,2221,2222,2223,2224],{"name":2032,"slug":2033,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2209,"slug":2210,"type":15},{"name":2225,"slug":2226,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":2229,"name":2229,"fn":2230,"description":2231,"org":2232,"tags":2233,"stars":2090,"repoUrl":2091,"updatedAt":2239},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2234,2235,2236,2237,2238],{"name":2029,"slug":2030,"type":15},{"name":2032,"slug":2033,"type":15},{"name":18,"slug":19,"type":15},{"name":2107,"slug":2108,"type":15},{"name":2209,"slug":2210,"type":15},"2026-05-13T06:14:17.582229",267]