using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using Pgvector.EntityFrameworkCore; namespace NexusReader.Infrastructure.Persistence; public class AppDbContextFactory : IDesignTimeDbContextFactory { public AppDbContext CreateDbContext(string[] args) { var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"; // Try to find the Web project directory by looking for the solution root var currentDir = new DirectoryInfo(Directory.GetCurrentDirectory()); while (currentDir != null && !File.Exists(Path.Combine(currentDir.FullName, "NexusReader.slnx"))) { currentDir = currentDir.Parent; } var basePath = currentDir != null ? Path.Combine(currentDir.FullName, "src", "NexusReader.Web.New") : Directory.GetCurrentDirectory(); var configuration = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: true) .AddJsonFile($"appsettings.{environment}.json", optional: true) .AddEnvironmentVariables() .Build(); var optionsBuilder = new DbContextOptionsBuilder(); var connectionString = configuration.GetConnectionString("PostgresConnection"); if (string.IsNullOrEmpty(connectionString)) { // For design time, if no PG connection is found, we might be using Sqlite or just testing connectionString = "Host=localhost;Database=nexus_reader;Username=postgres;Password=postgres"; } optionsBuilder.UseNpgsql(connectionString, x => x.UseVector()); return new AppDbContext(optionsBuilder.Options); } }