Fix: Startet nicht / MySQL-Timeout ohne UI (Config- & Startup-Härtung)

Ursachen (App startete aus bin/ bzw. per Doppelklick ohne UI):
1. appsettings.Local.json (MySQL-Connection) wurde NICHT ins Output kopiert und
   nur relativ zum Arbeitsverzeichnis geladen -> leere Connection -> Pomelo fiel
   auf localhost:3306 zurueck -> "Connect Timeout expired".
2. ServerVersion.AutoDetect(conn) oeffnet beim Options-Bau eine blockierende
   DB-Verbindung -> haengt/crasht den Start, wenn die DB nicht erreichbar ist.
3. CopyTradingEngine.StartAsync lud den MarketCache ungeschuetzt -> DB-Fehler
   riss AppHost.Start() ab, bevor die UI erschien.

Fixes:
- csproj: appsettings.Local.json mit ins Output kopieren (CopyToOutputDirectory).
- Program: UseContentRoot(AppContext.BaseDirectory) -> Config wird immer neben
  der EXE gesucht (Main + Smoke-Test).
- ServerVersion fest gepinnt: DatabaseServerVersion.Value = MariaDB 11.8.6 (wie
  am Server erkannt); AddCorePersistence + CopyTradingModule nutzen sie statt
  AutoDetect. Kein blockierender Connect mehr beim Start.
- CopyTradingEngine-Preload in try/catch: DB-Fehler bricht den Start nicht mehr ab.
- Neuer Diagnose-CLI --db-version (gibt @@version aus).

Verifiziert: --smoke-ui aus fremdem Arbeitsverzeichnis laeuft gruen
(3 Accounts / 32 Trader hydriert, alle Views + Launcher OK).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-06 10:03:44 +02:00
co-authored by Claude Opus 4.8
parent 6f478e8764
commit f1451b547c
7 changed files with 189 additions and 3 deletions
@@ -1,3 +1,6 @@
using System;
using Microsoft.EntityFrameworkCore;
namespace PolyTrader.Core.Configuration
{
/// <summary>
@@ -11,4 +14,15 @@ namespace PolyTrader.Core.Configuration
/// <summary>MySQL-Connection-String (aus gitignorierter appsettings.Local.json).</summary>
public string MySqlConnectionString { get; set; } = string.Empty;
}
/// <summary>
/// Feste Ziel-Server-Version (MariaDB 11.8.6, wie am Server erkannt). Bewusst gepinnt statt
/// <c>ServerVersion.AutoDetect</c>: AutoDetect öffnet beim Bau der DbContext-Optionen eine
/// blockierende DB-Verbindung ist die DB langsam/nicht erreichbar, hängt/crasht der Start,
/// bevor die UI erscheint. Mit fester Version startet die App unabhängig von der DB.
/// </summary>
public static class DatabaseServerVersion
{
public static ServerVersion Value => new MariaDbServerVersion(new Version(11, 8, 6));
}
}
@@ -17,7 +17,7 @@ namespace PolyTrader.Core.DependencyInjection
public static IServiceCollection AddCorePersistence(this IServiceCollection services, DatabaseOptions options)
{
var conn = options.MySqlConnectionString;
services.AddDbContextFactory<CoreDbContext>(o => o.UseMySql(conn, ServerVersion.AutoDetect(conn)));
services.AddDbContextFactory<CoreDbContext>(o => o.UseMySql(conn, DatabaseServerVersion.Value));
services.AddSingleton<IAccountRepository, EfAccountRepository>();
services.AddSingleton<IMarketRepository, EfMarketRepository>();