diff --git a/WhisperFTPApp/App.axaml.cs b/WhisperFTPApp/App.axaml.cs index 3c860a6..7e298e7 100644 --- a/WhisperFTPApp/App.axaml.cs +++ b/WhisperFTPApp/App.axaml.cs @@ -2,7 +2,9 @@ using System.Diagnostics; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using WhisperFTPApp.Data; using WhisperFTPApp.Extensions; @@ -19,11 +21,10 @@ public override void Initialize() { AvaloniaXamlLoader.Load(this); - var localization = LocalizationService.Instance; try { StaticFileLogger.LogInformation("Setting initial language..."); - localization.SetLanguage("en"); + LocalizationService.Instance.SetLanguage("en"); StaticFileLogger.LogInformation("Language set successfully"); } catch (Exception ex) @@ -34,25 +35,66 @@ public override void Initialize() public override void OnFrameworkInitializationCompleted() { - var collection = new ServiceCollection(); - collection.AddCommonServices(); - collection.AddCommonViewModels(); - collection.AddCommonWindows(); - - var serviceProvider = collection.BuildServiceProvider(); - var mainWindow = serviceProvider.GetRequiredService(); - - using (var scope = serviceProvider.CreateScope()) + try { - var context = scope.ServiceProvider.GetRequiredService(); - context.Database.EnsureCreated(); - } + BindingPlugins.DataValidators.RemoveAt(0); + + var collection = new ServiceCollection(); + + // Configure SQLite with specific options + collection.AddDbContext( + options => + { + options.UseSqlite("Data Source=DatabaseWhisperFTPApp.db", + sqliteOptions => { sqliteOptions.CommandTimeout(30); }); + }, ServiceLifetime.Singleton); + + collection.AddCommonServices(); + collection.AddCommonViewModels(); + collection.AddCommonWindows(); + + var serviceProvider = collection.BuildServiceProvider(); + + using (var scope = serviceProvider.CreateScope()) + { + var context = scope.ServiceProvider.GetRequiredService(); + try + { + StaticFileLogger.LogInformation("Initializing database..."); + context.Database.EnsureCreated(); - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + // Force connection close + context.Database.GetDbConnection().Close(); + + StaticFileLogger.LogInformation("Database initialized successfully"); + } + catch (Exception dbEx) + { + StaticFileLogger.LogError($"Database initialization failed: {dbEx}"); + throw; + } + } + + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = serviceProvider.GetRequiredService(); + desktop.ShutdownRequested += (s, e) => + { + // Cleanup on shutdown + using var scope = serviceProvider.CreateScope(); + var context = scope.ServiceProvider.GetRequiredService(); + context.Database.GetDbConnection().Close(); + }; + + StaticFileLogger.LogInformation("Application initialized successfully"); + } + + base.OnFrameworkInitializationCompleted(); + } + catch (Exception ex) { - desktop.MainWindow = mainWindow; + StaticFileLogger.LogError($"Application startup failed: {ex.Message}\nStackTrace: {ex.StackTrace}"); + throw; } - - base.OnFrameworkInitializationCompleted(); } } \ No newline at end of file diff --git a/WhisperFTPApp/DatabaseWhisperFTPApp.db b/WhisperFTPApp/DatabaseWhisperFTPApp.db index ee3d034..e235b7c 100644 Binary files a/WhisperFTPApp/DatabaseWhisperFTPApp.db and b/WhisperFTPApp/DatabaseWhisperFTPApp.db differ diff --git a/WhisperFTPApp/Migrations/20241225140648_Initial.Designer.cs b/WhisperFTPApp/Migrations/20241226121504_Initial.Designer.cs similarity index 94% rename from WhisperFTPApp/Migrations/20241225140648_Initial.Designer.cs rename to WhisperFTPApp/Migrations/20241226121504_Initial.Designer.cs index c3226d5..8720fa6 100644 --- a/WhisperFTPApp/Migrations/20241225140648_Initial.Designer.cs +++ b/WhisperFTPApp/Migrations/20241226121504_Initial.Designer.cs @@ -11,7 +11,7 @@ namespace WhisperFTPApp.Migrations { [DbContext(typeof(AppDbContext))] - [Migration("20241225140648_Initial")] + [Migration("20241226121504_Initial")] partial class Initial { /// @@ -54,7 +54,7 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) { Id = 1, Address = "ftp://demo.wftpserver.com", - LastUsed = new DateTime(2024, 12, 25, 16, 6, 48, 764, DateTimeKind.Local).AddTicks(9433), + LastUsed = new DateTime(2024, 12, 26, 14, 15, 4, 680, DateTimeKind.Local).AddTicks(908), Name = "ftp://demo.wftpserver.com", Password = "demo", Username = "demo" diff --git a/WhisperFTPApp/Migrations/20241225140648_Initial.cs b/WhisperFTPApp/Migrations/20241226121504_Initial.cs similarity index 94% rename from WhisperFTPApp/Migrations/20241225140648_Initial.cs rename to WhisperFTPApp/Migrations/20241226121504_Initial.cs index 961b99c..8a3dfb9 100644 --- a/WhisperFTPApp/Migrations/20241225140648_Initial.cs +++ b/WhisperFTPApp/Migrations/20241226121504_Initial.cs @@ -44,7 +44,7 @@ protected override void Up(MigrationBuilder migrationBuilder) migrationBuilder.InsertData( table: "FtpConnections", columns: new[] { "Id", "Address", "LastUsed", "Name", "Password", "Username" }, - values: new object[] { 1, "ftp://demo.wftpserver.com", new DateTime(2024, 12, 25, 16, 6, 48, 764, DateTimeKind.Local).AddTicks(9433), "ftp://demo.wftpserver.com", "demo", "demo" }); + values: new object[] { 1, "ftp://demo.wftpserver.com", new DateTime(2024, 12, 26, 14, 15, 4, 680, DateTimeKind.Local).AddTicks(908), "ftp://demo.wftpserver.com", "demo", "demo" }); migrationBuilder.InsertData( table: "Settings", diff --git a/WhisperFTPApp/Migrations/AppDbContextModelSnapshot.cs b/WhisperFTPApp/Migrations/AppDbContextModelSnapshot.cs index 1626ce0..0a91da7 100644 --- a/WhisperFTPApp/Migrations/AppDbContextModelSnapshot.cs +++ b/WhisperFTPApp/Migrations/AppDbContextModelSnapshot.cs @@ -51,7 +51,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { Id = 1, Address = "ftp://demo.wftpserver.com", - LastUsed = new DateTime(2024, 12, 25, 16, 6, 48, 764, DateTimeKind.Local).AddTicks(9433), + LastUsed = new DateTime(2024, 12, 26, 14, 15, 4, 680, DateTimeKind.Local).AddTicks(908), Name = "ftp://demo.wftpserver.com", Password = "demo", Username = "demo" diff --git a/WhisperFTPApp/WhisperFTPApp.csproj b/WhisperFTPApp/WhisperFTPApp.csproj index 706463d..300236f 100644 --- a/WhisperFTPApp/WhisperFTPApp.csproj +++ b/WhisperFTPApp/WhisperFTPApp.csproj @@ -10,6 +10,7 @@ 1.0.0.0 1.0.0.0 1.0.0.0 + true @@ -20,6 +21,7 @@ +