Files

593 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# .NET 10.0 Upgrade Plan — BettingPredictor
## Table of Contents
- [1. Executive Summary](#1-executive-summary)
- [1.1 Scope & Target](#11-scope--target)
- [1.2 Selected Strategy](#12-selected-strategy)
- [1.3 Complexity Classification](#13-complexity-classification)
- [1.4 Critical Issues](#14-critical-issues)
- [2. Migration Strategy](#2-migration-strategy)
- [2.1 Approach & Justification](#21-approach--justification)
- [2.2 Prerequisites](#22-prerequisites)
- [2.3 Implementation Timeline](#23-implementation-timeline)
- [3. Detailed Dependency Analysis](#3-detailed-dependency-analysis)
- [4. Project-by-Project Plans](#4-project-by-project-plans)
- [4.1 BettingPredictor.csproj](#41-bettingpredictorcsproj)
- [5. Package Update Reference](#5-package-update-reference)
- [5.1 Packages to Update](#51-packages-to-update)
- [5.2 Packages to Remove (Framework-Included)](#52-packages-to-remove-framework-included)
- [5.3 Packages to Add](#53-packages-to-add)
- [5.4 Compatible Packages (No Change)](#54-compatible-packages-no-change)
- [6. Breaking Changes Catalog](#6-breaking-changes-catalog)
- [6.1 SqlClient Namespace Migration](#61-sqlclient-namespace-migration)
- [6.2 WPF Binary Incompatibilities](#62-wpf-binary-incompatibilities)
- [6.3 Windows Forms API References](#63-windows-forms-api-references)
- [6.4 Legacy Configuration System](#64-legacy-configuration-system)
- [6.5 Behavioral Changes](#65-behavioral-changes)
- [7. Testing & Validation Strategy](#7-testing--validation-strategy)
- [8. Risk Management](#8-risk-management)
- [9. Complexity & Effort Assessment](#9-complexity--effort-assessment)
- [10. Source Control Strategy](#10-source-control-strategy)
- [11. Success Criteria](#11-success-criteria)
---
## 1. Executive Summary
### 1.1 Scope & Target
| Property | Value |
|---|---|
| **Solution** | BettingPredictor.sln |
| **Projects** | 1 (BettingPredictor.csproj) |
| **Project Type** | Classic WPF (non SDK-style) |
| **Current Framework** | .NET Framework 4.8.1 (net481) |
| **Target Framework** | .NET 10.0 (net10.0-windows) |
| **Total LOC** | 7,140 |
| **Total Files** | 39 (27 with compatibility issues) |
| **NuGet Packages** | 26 total — 9 to update, 6 to remove (framework-included) |
| **Total Issues** | 2,202 |
| **Estimated LOC Impact** | 2,185+ (~30.6% of codebase) |
### 1.2 Selected Strategy
**All-At-Once Strategy** — Single project upgraded in one atomic operation.
**Rationale**:
- 1 project (well under 30-project threshold)
- No inter-project dependencies
- Homogeneous codebase (single WPF desktop application)
- All 9 packages requiring update have known target versions (stable 10.0.5)
- No incompatible packages — all have clear upgrade or removal paths
- Fastest completion with single coordinated upgrade
### 1.3 Complexity Classification
**Simple** — ?5 projects, dependency depth 0, no security vulnerabilities, no circular dependencies.
| Criterion | Value | Threshold |
|---|---|---|
| Project count | 1 | ? 5 ? |
| Dependency depth | 0 | ? 2 ? |
| Security vulnerabilities | 0 | None ? |
| High-risk items | 0 | None ? |
**Iteration strategy**: Simple batch — all project details in 12 detail iterations.
### 1.4 Critical Issues
| Priority | Issue | Impact | Resolution |
|---|---|---|---|
| ?? Mandatory | SDK-style conversion | Project won't build in .NET 10 without SDK-style format | Use SDK-style conversion tool |
| ?? Mandatory | Target framework change | net481 ? net10.0-windows | Update TargetFramework in .csproj |
| ?? High | SqlClient namespace migration | 1,264 source-incompatible API references across 16+ files | Replace `System.Data.SqlClient` with `Microsoft.Data.SqlClient` |
| ?? High | 9 pre-release packages ? stable | rc.1 packages must move to stable 10.0.5 | Update PackageReference versions |
| ?? Medium | 6 framework-included packages | Redundant packages may cause conflicts | Remove PackageReference entries |
| ?? Low | WPF binary incompatibilities (897) | Resolved automatically by recompilation against .NET 10.0 WPF | No code changes — recompile with net10.0-windows |
| ?? Low | Behavioral changes (24) | JsonDocument, System.Uri — may affect runtime behavior | Requires runtime testing and validation |
| ?? Low | Legacy configuration (2) | Settings.Designer.cs uses old config system | Add `System.Configuration.ConfigurationManager` NuGet as bridge |
---
## 2. Migration Strategy
### 2.1 Approach & Justification
**All-At-Once** — All updates performed as a single coordinated atomic operation with no intermediate states.
This is ideal because:
- **Single project**: no dependency ordering needed
- **Clear package paths**: all 9 packages have exact target versions (10.0.5 stable)
- **No incompatible packages**: 0% incompatible, no blocking issues
- **WPF continuity**: WPF is fully supported in .NET 10.0 with `-windows` TFM — same APIs, new runtime
- **Risk is contained**: single project means build failures are immediately visible and fixable
### 2.2 Prerequisites
Before starting the atomic upgrade:
1. **Verify .NET 10.0 SDK installation**
- Required SDK version: .NET 10.0 or later
- Download from: https://dotnet.microsoft.com/download/dotnet/10.0
- Verify with: `dotnet --list-sdks`
2. **Check global.json** (if present)
- Ensure it allows .NET 10.0 SDK or update/remove it
- If present, update `sdk.version` to a .NET 10.0 compatible version
3. **Source control**
- Working branch: `upgrade-to-NET8` (from `main`)
- No pending changes
### 2.3 Implementation Timeline
#### Phase 0: Preparation
- Verify .NET 10.0 SDK installation
- Validate global.json compatibility
#### Phase 1: Atomic Upgrade
**Operations** (performed as single coordinated batch):
1. Convert project to SDK-style format
2. Update TargetFramework to `net10.0-windows`
3. Update all 9 package references to stable versions
4. Remove 6 framework-included package references
5. Add `Microsoft.Data.SqlClient` package
6. Replace all `System.Data.SqlClient` usages with `Microsoft.Data.SqlClient`
7. Address legacy configuration bridge (add `System.Configuration.ConfigurationManager` if needed)
8. Build solution and fix all compilation errors
9. Verify: solution builds with 0 errors
**Deliverable**: Solution builds successfully targeting net10.0-windows
#### Phase 2: Validation
**Operations**:
- No automated test projects exist in the solution
- Manual verification of application startup and core functionality
- Review behavioral changes (JsonDocument, System.Uri) at runtime
**Deliverable**: Application runs correctly on .NET 10.0
---
## 3. Detailed Dependency Analysis
This solution contains a **single project** with **zero project dependencies** and **zero dependants**. There is no dependency graph to navigate — the upgrade operates on one isolated project.
```mermaid
flowchart LR
P1["BettingPredictor.csproj\nnet481 ? net10.0-windows"]
```
| Property | Value |
|---|---|
| Total projects | 1 |
| Dependency depth | 0 |
| Circular dependencies | None |
| Critical path | BettingPredictor.csproj (only project) |
| Migration phases needed | 1 (atomic) |
| Test projects | 0 |
Since there is only one project with no dependencies, the entire upgrade is executed as a single atomic operation. No phased ordering is required.
---
## 4. Project-by-Project Plans
### 4.1 BettingPredictor.csproj
#### Current State
| Property | Value |
|---|---|
| **Path** | `HorseRacingPredictor\HorseRacingPredictor\BettingPredictor.csproj` |
| **Target Framework** | net481 (.NET Framework 4.8.1) |
| **SDK-style** | ? No (Classic WPF format) |
| **Project Kind** | ClassicWpf |
| **Lines of Code** | 7,140 |
| **Files** | 43 total, 27 with incidents |
| **NuGet Packages** | 26 (9 update, 6 remove, 11 compatible) |
| **Dependencies** | 0 project references |
| **Dependants** | 0 |
| **Risk Level** | ?? Medium |
**Key technologies used**:
- WPF (Windows Presentation Foundation) — primary UI framework
- WebView2 — embedded browser control
- Microsoft.ML / ML.NET — machine learning predictions
- System.Data.SqlClient — SQL database access
- RestSharp — REST API client
- CsvHelper — CSV file handling
- Newtonsoft.Json & System.Text.Json — JSON serialization
#### Target State
| Property | Value |
|---|---|
| **Target Framework** | net10.0-windows |
| **SDK-style** | ? Yes |
| **Updated packages** | 9 |
| **Removed packages** | 6 (framework-included) |
| **New packages** | Microsoft.Data.SqlClient, System.Configuration.ConfigurationManager |
#### Migration Steps
**Step 1: Convert to SDK-style project**
- Use the SDK-style conversion tool on `BettingPredictor.csproj`
- The conversion tool handles:
- Migrating `<PackageReference>` entries from `packages.config`
- Setting up the new SDK-style project structure
- Preserving existing project configuration
- After conversion, the `.csproj` will use `Microsoft.NET.Sdk` format
**Step 2: Update TargetFramework**
- Change `<TargetFramework>` to `net10.0-windows`
- This enables WPF and WinForms support via the `-windows` platform specifier
- No need for `<UseWPF>true</UseWPF>` separately — SDK-style WPF projects include this automatically when converted
**Step 3: Update package references (9 packages)**
- Update all pre-release (rc.1) packages to stable 10.0.5 versions
- See [§5.1 Packages to Update](#51-packages-to-update) for complete version matrix
**Step 4: Remove framework-included packages (6 packages)**
- Remove references to packages whose functionality is now built into .NET 10.0
- See [§5.2 Packages to Remove](#52-packages-to-remove-framework-included) for complete list
**Step 5: Migrate SqlClient**
- Add `Microsoft.Data.SqlClient` NuGet package
- In all affected files, replace:
- `using System.Data.SqlClient;` ? `using Microsoft.Data.SqlClient;`
- The API surface is identical — `SqlConnection`, `SqlCommand`, `SqlParameter`, `SqlTransaction` all exist in `Microsoft.Data.SqlClient` with the same signatures
- **Affected files** (16 files, ~1,264 API references):
- `Manager\Database.cs` (12 issues) — base database class with `GetConnection()`, transactions
- `Football\Manager\Database.cs` (10 issues) — football-specific DB operations
- `Football\Database\APIResponse.cs` (82 issues)
- `Football\Database\LeagueStats.cs` (76 issues)
- `Football\Database\Fixture.cs` (67 issues)
- `Football\Database\Comparison.cs` (64 issues)
- `Football\Database\League.cs` (57 issues)
- `Football\Database\TeamStats.cs` (56 issues)
- `Football\Database\Prediction.cs` (52 issues)
- `Football\Database\Odds.cs` (43 issues)
- `Football\Database\Score.cs` (40 issues)
- `Football\Database\FixtureLeague.cs` (39 issues)
- `Football\Database\H2H.cs` (20 issues)
- `Football\Database\Goals.cs` (16 issues)
- `Football\Database\BetType.cs` (12 issues)
- `Football\Database\Bookmaker.cs` (12 issues)
**Step 6: Address legacy configuration**
- `Properties\Settings.Designer.cs` (2 issues) uses the legacy `System.Configuration` APIs
- Add NuGet package `System.Configuration.ConfigurationManager` as an interim bridge
- This provides the `ConfigurationManager`, `Settings`, and related classes on .NET 10.0
- ?? Long-term recommendation: migrate to `Microsoft.Extensions.Configuration` with `appsettings.json`
**Step 7: Restore, build, and fix compilation errors**
- Run `dotnet restore` to resolve all updated package references
- Build the entire solution
- Fix any compilation errors discovered (expected areas: SqlClient namespace, removed APIs, configuration)
- Rebuild and verify: **0 compilation errors**
#### Validation Checklist
- [ ] Project converted to SDK-style
- [ ] TargetFramework set to net10.0-windows
- [ ] All 9 packages updated to stable versions
- [ ] 6 framework-included packages removed
- [ ] Microsoft.Data.SqlClient added and all usages migrated
- [ ] System.Configuration.ConfigurationManager added (if needed)
- [ ] Solution builds with 0 errors
- [ ] Solution builds with 0 warnings (best effort)
- [ ] Application starts and main UI renders correctly
---
## 5. Package Update Reference
### 5.1 Packages to Update
All 9 packages are currently on pre-release `10.0.0-rc.1.25451.107` and must be updated to stable `10.0.5`.
| Package | Current Version | Target Version | Reason |
|---|---|---|---|
| Microsoft.Bcl.AsyncInterfaces | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| Microsoft.Bcl.Numerics | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.CodeDom | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.Collections.Immutable | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.IO.Pipelines | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.Numerics.Tensors | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.Text.Encodings.Web | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.Text.Json | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
| System.Threading.Channels | 10.0.0-rc.1.25451.107 | 10.0.5 | Pre-release ? stable |
### 5.2 Packages to Remove (Framework-Included)
These packages provide functionality that is now built into the .NET 10.0 runtime. Their `PackageReference` entries should be removed to avoid version conflicts.
| Package | Current Version | Reason for Removal |
|---|---|---|
| System.Buffers | 4.6.1 | Included in .NET 10.0 runtime |
| System.Memory | 4.6.3 | Included in .NET 10.0 runtime |
| System.Numerics.Vectors | 4.6.1 | Included in .NET 10.0 runtime |
| System.Reflection.Emit.Lightweight | 4.7.0 | Included in .NET 10.0 runtime |
| System.Threading.Tasks.Extensions | 4.6.3 | Included in .NET 10.0 runtime |
| System.ValueTuple | 4.6.1 | Included in .NET 10.0 runtime |
### 5.3 Packages to Add
| Package | Version | Reason |
|---|---|---|
| Microsoft.Data.SqlClient | Latest stable | Replaces `System.Data.SqlClient` for .NET 10.0 |
| System.Configuration.ConfigurationManager | Latest stable for net10.0 | Bridge for legacy `Settings.Designer.cs` configuration |
### 5.4 Compatible Packages (No Change)
These packages are already compatible with .NET 10.0 and require no version changes.
| Package | Current Version | Notes |
|---|---|---|
| CsvHelper | 33.1.0 | ? Compatible |
| Microsoft.Bcl.HashCode | 6.0.0 | ? Compatible |
| Microsoft.CSharp | 4.7.0 | ? Compatible |
| Microsoft.ML | 5.0.0-preview.25503.2 | ? Compatible (pre-release but no stable alternative) |
| Microsoft.ML.CpuMath | 5.0.0-preview.25503.2 | ? Compatible |
| Microsoft.ML.DataView | 5.0.0-preview.25503.2 | ? Compatible |
| Microsoft.ML.FastTree | 5.0.0-preview.25503.2 | ? Compatible |
| Microsoft.Web.WebView2 | 1.0.3800.47 | ? Compatible |
| Newtonsoft.Json | 13.0.4 | ? Compatible |
| RestSharp | 112.1.1-alpha.0.4 | ? Compatible |
| System.Runtime.CompilerServices.Unsafe | 6.1.2 | ? Compatible |
---
## 6. Breaking Changes Catalog
### 6.1 SqlClient Namespace Migration
**Category**: Source Incompatible
**Impact**: 1,264 API references across 16+ files
**Severity**: High — requires code changes in every database access file
**Problem**: `System.Data.SqlClient` is not available as a built-in namespace in .NET 10.0. The legacy `System.Data.SqlClient` namespace shipped with .NET Framework is replaced by the standalone `Microsoft.Data.SqlClient` package.
**Resolution**:
1. Add NuGet package `Microsoft.Data.SqlClient`
2. In every file that uses `System.Data.SqlClient`, change:
```csharp
// Before
using System.Data.SqlClient;
// After
using Microsoft.Data.SqlClient;
```
3. The API surface is **API-compatible** — same class names (`SqlConnection`, `SqlCommand`, `SqlParameter`, `SqlTransaction`, etc.) with identical method signatures
4. No logic changes required — only the `using` directive changes
**Affected classes and methods** (most frequent):
- `SqlParameterCollection` / `SqlCommand.Parameters` (273 references)
- `SqlParameter` (273 references)
- `SqlParameterCollection.AddWithValue()` (270 references)
- `SqlConnection` (35 references)
- `SqlCommand` (33 references)
- `SqlCommand.ExecuteNonQuery()` (23 references)
- `SqlCommand.ExecuteScalar()` (8 references)
- `SqlTransaction` / `BeginTransaction()` / `Commit()` / `Rollback()` (10 references)
### 6.2 WPF Binary Incompatibilities
**Category**: Binary Incompatible
**Impact**: 897 API references
**Severity**: Low — **resolved automatically by recompilation**
**Problem**: WPF types in .NET 10.0 are binary-incompatible with .NET Framework 4.8.1 assemblies. The types exist at the same namespaces and with the same API surfaces, but are in different assemblies.
**Resolution**: No code changes needed. Targeting `net10.0-windows` and recompiling resolves all 897 binary incompatibilities. The WPF APIs (`TextBox`, `TextBlock`, `Button`, `ComboBox`, `DataGrid`, `DatePicker`, `CheckBox`, `RadioButton`, `ProgressBar`, `MessageBox`, `Grid`, `Visibility`, etc.) are fully available in .NET 10.0 WPF.
### 6.3 Windows Forms API References
**Category**: Binary Incompatible
**Impact**: 18 API references
**Severity**: Low — **resolved automatically by targeting net10.0-windows**
**Problem**: The project uses some Windows Forms APIs (likely `FolderBrowserDialog`, `OpenFileDialog`, or similar interop). These are binary incompatible across frameworks.
**Resolution**: The `-windows` platform specifier in `net10.0-windows` automatically enables both WPF and WinForms support. Recompilation resolves these references.
### 6.4 Legacy Configuration System
**Category**: Source Incompatible
**Impact**: 2 API references in `Properties\Settings.Designer.cs`
**Severity**: Low
**Problem**: The legacy `System.Configuration` APIs (`ConfigurationManager`, `ApplicationSettingsBase`, etc.) from `app.config` / `web.config` are not built into .NET 10.0.
**Resolution**:
- Add NuGet package `System.Configuration.ConfigurationManager` to provide the legacy APIs as a bridge
- `Properties\Settings.Designer.cs` will compile and work as before
- ?? **Long-term recommendation**: Migrate to `Microsoft.Extensions.Configuration` with JSON-based configuration (`appsettings.json`), but this is optional and can be deferred
### 6.5 Behavioral Changes
**Category**: Behavioral Change
**Impact**: 24 API references (16 JsonDocument, 6 System.Uri, 2 other)
**Severity**: Low — no compilation errors, but may cause runtime behavior differences
#### 6.5.1 System.Text.Json.JsonDocument (16 references)
**Files affected**: `HorseRacing\API\RacingApiClient.cs`, `HorseRacing\Main.cs`
**Potential changes in .NET 10.0**:
- Stricter JSON parsing by default
- Changes to how trailing commas, comments, and edge cases are handled
- `JsonSerializerOptions` defaults may differ
**Mitigation**: Test JSON parsing scenarios thoroughly. If issues arise, configure `JsonSerializerOptions` or `JsonDocumentOptions` to match previous behavior (e.g., `AllowTrailingCommas = true`).
#### 6.5.2 System.Uri (6 references)
**Files affected**: `HorseRacing\API\RacingApiClient.cs`, `HorseRacing\Main.cs`
**Potential changes in .NET 10.0**:
- More strict URI parsing conforming to RFC 3986
- Changes in how relative URIs and encoding edge cases are handled
**Mitigation**: Test URI-based operations (API endpoint construction, WebView2 navigation). Typically no issues with standard HTTP/HTTPS URIs.
---
## 7. Testing & Validation Strategy
### 7.1 Automated Tests
?? **No automated test projects exist** in this solution. There are no unit test, integration test, or other test projects to execute.
### 7.2 Build Verification
The primary automated validation is build success:
- [ ] `dotnet restore` completes without errors
- [ ] `dotnet build` completes with **0 errors**
- [ ] No NuGet package version conflicts
- [ ] No unresolved assembly references
### 7.3 Runtime Validation Areas
Since there are no automated tests, the following areas should be manually verified after the upgrade:
| Area | What to Verify | Risk |
|---|---|---|
| **Application startup** | App starts, main window renders correctly | Low — WPF is fully supported |
| **Navigation** | All 4 pages (Football, Racing, Virtual Football, Settings) load | Low |
| **WebView2** | Virtual Football page loads WebView2 browser correctly | Low — WebView2 is compatible |
| **Database operations** | Football/Racing data download and storage work (SqlClient migration) | Medium — namespace change |
| **API calls** | FormFav and Football API calls succeed (RestSharp + JSON parsing) | Medium — behavioral changes |
| **CSV import/export** | CsvHelper operations work correctly | Low — compatible package |
| **Settings persistence** | Save/load settings works (legacy config bridge) | Low |
| **ML predictions** | ML.NET prediction pipeline runs without errors | Low — compatible packages |
### 7.4 Behavioral Change Validation
These specific scenarios require targeted testing due to behavioral changes in .NET 10.0:
1. **JsonDocument parsing** — Test API response parsing in `RacingApiClient.cs` and `Main.cs`:
- Verify JSON responses from FormFav API are parsed correctly
- Test edge cases: empty responses, malformed JSON, large payloads
2. **System.Uri** — Test URL construction in API clients:
- Verify API endpoint URLs are constructed correctly
- Test WebView2 navigation URLs
---
## 8. Risk Management
### 8.1 Risk Assessment
| Risk | Level | Description | Mitigation |
|---|---|---|---|
| SDK-style conversion fails | ?? Medium | Conversion tool may not handle all classic WPF project features | Manual .csproj cleanup after conversion; verify all files included |
| SqlClient migration breaks DB access | ?? Medium | Namespace-only change, but large surface area (1,264 references) | Global find-and-replace `System.Data.SqlClient` ? `Microsoft.Data.SqlClient`; API is compatible |
| ML.NET packages incompatible | ?? Low | ML packages are pre-release (5.0.0-preview) | Assessment confirms compatibility; fall back to stable ML.NET 4.x if needed |
| RestSharp pre-release issues | ?? Low | RestSharp is 112.1.1-alpha.0.4 | Assessment confirms compatibility; fall back to stable RestSharp if needed |
| Behavioral changes cause runtime issues | ?? Low | JsonDocument and Uri behavior differences | Configure strict/lenient options; manual testing of affected paths |
| Legacy config bridge insufficient | ?? Low | Settings.Designer.cs may need additional adjustments | System.Configuration.ConfigurationManager package provides full bridge |
| WPF rendering differences | ?? Low | Minor visual differences between .NET Framework and .NET 10.0 WPF | Visual inspection; typically identical rendering |
### 8.2 Contingency Plans
| Scenario | Action |
|---|---|
| SDK-style conversion produces broken .csproj | Manually create SDK-style .csproj with correct structure, copy settings |
| Microsoft.Data.SqlClient has API differences | Check Microsoft.Data.SqlClient migration guide for any breaking changes beyond namespace |
| ML.NET predictions fail | Pin ML.NET to last known working version for net10.0 |
| Build fails with unresolvable errors | Roll back to `main` branch, investigate specific errors |
---
## 9. Complexity & Effort Assessment
### 9.1 Overall Assessment
| Factor | Rating | Justification |
|---|---|---|
| **Overall complexity** | ?? Medium | Single project but large LOC impact (30.6%), major SqlClient migration |
| **SDK-style conversion** | Low | Automated tool handles conversion |
| **Framework update** | Low | Single TFM change |
| **Package updates** | Low | All 9 are simple version bumps (rc ? stable) |
| **Package removals** | Low | 6 straightforward removals |
| **SqlClient migration** | Medium | Large number of files (16+) but mechanical namespace change |
| **WPF compatibility** | Low | Resolved by recompilation |
| **Configuration bridge** | Low | Single package addition, 2 affected references |
| **Behavioral changes** | Low | 24 references, requires testing not code changes |
### 9.2 Complexity by File Area
| Area | Files Affected | Issue Count | Complexity |
|---|---|---|---|
| Football Database classes | 14 files | ~1,200+ | Medium (bulk SqlClient rename) |
| Manager Database classes | 2 files | 22 | Low |
| API Client / Main | 2 files | 7 | Low (behavioral testing) |
| Settings | 1 file | 2 | Low |
| Project file | 1 file | 17 | Low (tooling-assisted) |
| WPF UI files | ~8 files | 897 | Low (automatic via recompilation) |
---
## 10. Source Control Strategy
### 10.1 Branch Strategy
| Property | Value |
|---|---|
| **Source branch** | `main` |
| **Upgrade branch** | `upgrade-to-NET8` |
| **Approach** | Single commit for entire atomic upgrade |
### 10.2 Commit Strategy
**Single commit** for the entire All-At-Once upgrade operation:
- **Commit message**: `Upgrade BettingPredictor from .NET Framework 4.8.1 to .NET 10.0`
- **Contents**: SDK-style conversion + TFM change + all package updates + SqlClient migration + config bridge + compilation fixes
- **Rationale**: Single project, single atomic operation — one commit captures the complete upgrade
### 10.3 Review & Merge
- Create Pull Request from `upgrade-to-NET8` ? `main`
- PR checklist:
- [ ] Solution builds with 0 errors
- [ ] All package references correct (no pre-release, no framework-included)
- [ ] SqlClient migration complete (no remaining `System.Data.SqlClient` references)
- [ ] Application starts and core functionality works
- [ ] Manual verification of behavioral change areas
---
## 11. Success Criteria
### 11.1 Technical Criteria
- [ ] Project targets `net10.0-windows`
- [ ] Project uses SDK-style format
- [ ] All 9 packages updated from rc.1 to stable 10.0.5
- [ ] All 6 framework-included packages removed
- [ ] `Microsoft.Data.SqlClient` added and all `System.Data.SqlClient` references migrated
- [ ] `System.Configuration.ConfigurationManager` added for legacy config bridge
- [ ] Solution builds with **0 errors**
- [ ] No NuGet package dependency conflicts
- [ ] No security vulnerabilities
### 11.2 Quality Criteria
- [ ] No remaining references to `System.Data.SqlClient` namespace
- [ ] No remaining pre-release package versions (except ML.NET and RestSharp which are already pre-release by design)
- [ ] No framework-included packages remaining as explicit references
- [ ] Code quality maintained (no workarounds or hacks)
### 11.3 Process Criteria
- [ ] All-At-Once strategy followed (single atomic operation)
- [ ] All changes in `upgrade-to-NET8` branch
- [ ] Single commit capturing complete upgrade
- [ ] Assessment findings fully addressed