diff --git a/SaBusMgrCoreWeb/SaBusMgrCoreWeb.csproj b/SaBusMgrCoreWeb/SaBusMgrCoreWeb.csproj
index 2b50d82..6ec60fe 100644
--- a/SaBusMgrCoreWeb/SaBusMgrCoreWeb.csproj
+++ b/SaBusMgrCoreWeb/SaBusMgrCoreWeb.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs b/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs
index 33ece4f..7ee74b4 100644
--- a/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs
+++ b/SaBusMgrCoreWeb/Web/App/SbmStartup_Web.cs
@@ -1,4 +1,4 @@
-using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
@@ -99,10 +99,6 @@ namespace Sarand.BusinessMgr.Net.Core.Web.App
// Modify pages during debug.
#if DEBUG
if (SbmSystem.DebugMode)
- // If the following line throws an error such as:
- // 'imvcbuilder' does not contain a definition for 'addrazorruntimecompilation'
- // Revert the NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation package
- // to a previous version and then reinstal the latest version.
config.services.AddRazorPages().AddRazorRuntimeCompilation();
#endif
diff --git a/SaBusinessMgrCoreWebControl/SaBusinessMgrCoreWebControl.csproj b/SaBusinessMgrCoreWebControl/SaBusinessMgrCoreWebControl.csproj
index a529c59..ec0b162 100644
--- a/SaBusinessMgrCoreWebControl/SaBusinessMgrCoreWebControl.csproj
+++ b/SaBusinessMgrCoreWebControl/SaBusinessMgrCoreWebControl.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj b/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj
index 8b23ffa..7d346e5 100644
--- a/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj
+++ b/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/docs/component-reviews.md b/docs/component-reviews.md
index 8b204e8..d406299 100644
--- a/docs/component-reviews.md
+++ b/docs/component-reviews.md
@@ -7,11 +7,12 @@ table td {
}
-Last updated: 2026-09-15
+Last updated: 2026-09-16
| Component | Scope | Status | Date reviewed | Next steps | Notes |
|---|---|---|---|---|---|
-| `BusinessMgr.sln` | .NET 10 restore, Debug build, and tests | Migrated; passing with warnings | 2026-09-15 | Review Razor runtime compilation and System.Drawing, perform application smoke tests, then release-validate. | All eight projects target `net10.0`. The solution consumes Common's tested System.Data.Odbc 10.0.12 and Microsoft.Data.SqlClient 7.0.3 dependencies transitively. Control tests pass 11 of 11 and Portal tests pass 13 of 13. |
+| `BusinessMgr.sln` | .NET 10 restore, Debug build, and tests | Migrated; passing with warnings | 2026-09-16 | Review System.Drawing.Common, perform application smoke tests, then release-validate. | All eight projects target `net10.0`. Razor runtime compilation 10.0.12 and the tested Common database dependencies are aligned with .NET 10. Control tests pass 11 of 11 and Portal tests pass 13 of 13. |
+| `SaBusMgrCoreWeb` and web applications | Razor runtime compilation | Dependency aligned with .NET 10 | 2026-09-16 | Retain the package-owner audits and cover runtime view compilation in application smoke testing. | Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 10.0.12 is referenced by the shared web project and both applications. The solution build and both test suites pass, and all three package audits report no known vulnerabilities. |
| `SaBusMgrStandardBase/Base/Helpers/SbmPasswordHelper.cs` and `SaBusinessMgrCoreWebControl/Control/Helpers/SbmcPasswordHelper.cs` | Password hashing | Dependency upgrade complete; legacy hashes compatible | 2026-09-13 | Preserve the compatibility tests when password-hashing defaults or account migration behavior changes. | Both helpers use `PasswordHasher` from `Microsoft.Extensions.Identity.Core` 10.0.12. Current hashes round-trip, wrong passwords fail, and legacy Identity V3 hashes remain valid while being identified for rehash. |
-| `eng/validate.ps1` | Repository validation | Complete; passing | 2026-09-14 | Use as the standard validation entry point and extend it when repository-wide checks change. | Restores and builds serially with the .NET CLI, runs 11 Control and 13 Portal NUnit tests, audits the Identity-package-owning project, and verifies changed-file line endings and diffs. |
+| `eng/validate.ps1` | Repository validation | Complete; passing | 2026-09-16 | Use as the standard validation entry point and extend it when repository-wide checks change. | Restores and builds serially with the .NET CLI, runs 11 Control and 13 Portal NUnit tests, audits the Identity and three web package owners, and verifies changed-file line endings and diffs. |
| `SaBusMgrTest_Control` and `SaBusMgrTest_Portal` | Test framework, SDK, and coverage tooling | Migrated to NUnit; coverage verified | 2026-09-15 | Use NUnit constraint assertions with `Assert.That` wherever possible. | Both projects use Microsoft.NET.Test.Sdk 18.10.0, NUnit 4.6.1, NUnit3TestAdapter 6.3.0, NUnit.Analyzers 4.15.0, and coverlet collector 10.0.1. All tests use NUnit's constraint assertion model; Control passes 11 tests and Portal passes 13 tests. The Control base fixture constructs valid session data from the configured test account, avoiding a null session in console tests. The optional validation coverage mode verifies a non-empty Cobertura report from each suite without an SSDT-specific publish step. |
diff --git a/docs/topics.md b/docs/topics.md
index ccf8f5a..592c4df 100644
--- a/docs/topics.md
+++ b/docs/topics.md
@@ -7,13 +7,13 @@ table td {
}
-Last updated: 2026-09-15
+Last updated: 2026-09-16
## Prioritised Topics to Be Actioned
| Priority | Topic | Date noted | Next step | Notes |
|---|---|---|---|---|
-| P2 | Review framework-specific package versions after .NET 10 retargeting | 2026-09-10 | Review Razor runtime compilation and System.Drawing packages for supported .NET 10 versions and behavior before release validation. | Identity and ODBC are aligned with .NET 10. The remaining 6.x package generations compile and all tests pass, but should not be assumed to be fully supported merely because compilation succeeds. |
+| P2 | Review System.Drawing.Common after .NET 10 retargeting | 2026-09-10 | Inventory the drawing APIs and runtime platforms, then decide whether to update the Windows-only package or replace its usage before release validation. | Identity, ODBC, SqlClient, and Razor runtime compilation are aligned with .NET 10. System.Drawing.Common remains on 6.0.0 and needs a separate compatibility review rather than a blind update. |
## .NET 10 Dependencies and Sequence
@@ -34,6 +34,7 @@ Last updated: 2026-09-15
| Topic | Date noted | Date started | Date completed | Outcome |
|---|---|---|---|---|
+| Align Razor runtime compilation with .NET 10 | 2026-09-16 | 2026-09-16 | 2026-09-16 | Updated Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation from 6.0.36 to 10.0.12 in the shared web project and both web applications. The complete solution builds; Control passes 11 tests and Portal passes 13 tests. Automated validation now audits all three web package owners, and all report no known vulnerable packages. |
| Validate the Common Microsoft.Data.SqlClient 7 upgrade | 2026-09-15 | 2026-09-15 | 2026-09-15 | Common now supplies Microsoft.Data.SqlClient 7.0.3 transitively. BusinessMgr builds successfully and both NUnit suites pass without requiring consumer source or package changes. |
| Consume Common's .NET 10 ODBC dependency | 2026-09-15 | 2026-09-15 | 2026-09-15 | Removed six redundant direct System.Data.Odbc 6.0.2 references. BusinessMgr consumes System.Data.Odbc 10.0.12 transitively through the Common database project where the implementation and eight focused provider tests reside. The solution builds with zero errors; Control passes 11 tests and Portal passes 13 tests. |
| Migrate BusinessMgr tests from MSTest to NUnit | 2026-09-14 | 2026-09-14 | 2026-09-15 | Replaced MSTest with NUnit 4.6.1, NUnit3TestAdapter 6.3.0, and NUnit.Analyzers 4.15.0 in both test projects. Converted all eight fixtures and 24 tests to NUnit's constraint-style `Assert.That` model and brought every migrated fixture into line with the repository's section-comment convention. Removed unused Portal SSDT SQL unit-testing references and targets plus one unused transitive Application Insights namespace dependency. The Control base fixture now constructs representative session data instead of passing an uninitialised null value, removing its nullable warning and ensuring its console tests exercise a valid user session. The complete solution builds with the .NET CLI; Control passes 11 tests and Portal passes 13 tests, including coverage collection. |
diff --git a/eng/README.md b/eng/README.md
index 221920d..5951997 100644
--- a/eng/README.md
+++ b/eng/README.md
@@ -8,4 +8,4 @@ Run the complete BusinessMgr validation:
Use `-SkipRestore` when packages are already restored. Use `-CollectCoverage` after changing the test platform or coverage collector; it runs additional coverage passes and verifies that both suites produce non-empty Cobertura reports.
-The script suppresses .NET first-run setup and banners, restores and builds serially with the .NET CLI, runs both NUnit projects, audits the Identity-package-owning project for vulnerable packages, stores test and optional coverage output under the ignored `TestResults/Validation` folder, checks the Git diff, and verifies working-tree line endings without modifying files. Its isolated `DOTNET_CLI_HOME` stores only CLI state; NuGet packages reuse `NUGET_PACKAGES` when already configured or the user's standard `.nuget/packages` cache.
+The script suppresses .NET first-run setup and banners, restores and builds serially with the .NET CLI, runs both NUnit projects, audits the Identity- and web-package-owning projects for vulnerable packages, stores test and optional coverage output under the ignored `TestResults/Validation` folder, checks the Git diff, and verifies working-tree line endings without modifying files. Its isolated `DOTNET_CLI_HOME` stores only CLI state; NuGet packages reuse `NUGET_PACKAGES` when already configured or the user's standard `.nuget/packages` cache.
diff --git a/eng/validate.ps1 b/eng/validate.ps1
index 39cde49..669f7e5 100644
--- a/eng/validate.ps1
+++ b/eng/validate.ps1
@@ -116,6 +116,9 @@ try
Test-CoverageReport $portalCoveragePath
}
Invoke-External dotnet @('list', 'SaBusMgrStandardBase\SaBusMgrStandardBase.csproj', 'package', '--vulnerable', '--include-transitive')
+ Invoke-External dotnet @('list', 'SaBusMgrCoreWeb\SaBusMgrCoreWeb.csproj', 'package', '--vulnerable', '--include-transitive')
+ Invoke-External dotnet @('list', 'SaBusinessMgrCoreWebControl\SaBusinessMgrCoreWebControl.csproj', 'package', '--vulnerable', '--include-transitive')
+ Invoke-External dotnet @('list', 'SaBusinessMgrCoreWebPortal\SaBusinessMgrCoreWebPortal.csproj', 'package', '--vulnerable', '--include-transitive')
Invoke-External git @('diff', '--check')
Test-LineEndings