diff --git a/Content.Server.Database/DesignTimeContextFactories.cs b/Content.Server.Database/DesignTimeContextFactories.cs new file mode 100644 index 0000000000..1955abe061 --- /dev/null +++ b/Content.Server.Database/DesignTimeContextFactories.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +// ReSharper disable UnusedType.Global + +namespace Content.Server.Database; + +public sealed class DesignTimeContextFactoryPostgres : IDesignTimeDbContextFactory +{ + public PostgresServerDbContext CreateDbContext(string[] args) + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseNpgsql(args[0]); + return new PostgresServerDbContext(optionsBuilder.Options); + } +} + +public sealed class DesignTimeContextFactorySqlite : IDesignTimeDbContextFactory +{ + public SqliteServerDbContext CreateDbContext(string[] args) + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseSqlite(args[0]); + return new SqliteServerDbContext(optionsBuilder.Options); + } +} diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index 3bafd18d7a..bd2edcbc63 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -11,22 +11,10 @@ namespace Content.Server.Database { public abstract class ServerDbContext : DbContext { - /// - /// The "dotnet ef" CLI tool uses the parameter-less constructor. - /// When that happens we want to supply the via . - /// To use the context within the application, the options need to be passed the constructor instead. - /// - protected readonly bool InitializedWithOptions; - - public ServerDbContext() + protected ServerDbContext(DbContextOptions options) : base(options) { } - public ServerDbContext(DbContextOptions options) : base(options) - { - InitializedWithOptions = true; - } - public DbSet Preference { get; set; } = null!; public DbSet Profile { get; set; } = null!; public DbSet AssignedUserId { get; set; } = null!; diff --git a/Content.Server.Database/ModelPostgres.cs b/Content.Server.Database/ModelPostgres.cs index 8e1240c4c5..682b6e5752 100644 --- a/Content.Server.Database/ModelPostgres.cs +++ b/Content.Server.Database/ModelPostgres.cs @@ -8,21 +8,17 @@ namespace Content.Server.Database { public sealed class PostgresServerDbContext : ServerDbContext { - // This is used by the "dotnet ef" CLI tool. - public PostgresServerDbContext() - { - } - static PostgresServerDbContext() { AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); } + public PostgresServerDbContext(DbContextOptions options) : base(options) + { + } + protected override void OnConfiguring(DbContextOptionsBuilder options) { - if (!InitializedWithOptions) - options.UseNpgsql("dummy connection string"); - options.ReplaceService(); ((IDbContextOptionsBuilderInfrastructure) options).AddOrUpdateExtension(new SnakeCaseExtension()); @@ -41,10 +37,6 @@ namespace Content.Server.Database #endif } - public PostgresServerDbContext(DbContextOptions options) : base(options) - { - } - protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); diff --git a/Content.Server.Database/ModelSqlite.cs b/Content.Server.Database/ModelSqlite.cs index f2c0d8bb54..1d9a9a25ad 100644 --- a/Content.Server.Database/ModelSqlite.cs +++ b/Content.Server.Database/ModelSqlite.cs @@ -13,15 +13,12 @@ namespace Content.Server.Database { public sealed class SqliteServerDbContext : ServerDbContext { - public SqliteServerDbContext() + public SqliteServerDbContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder options) { - if (!InitializedWithOptions) - options.UseSqlite("dummy connection string"); - ((IDbContextOptionsBuilderInfrastructure) options).AddOrUpdateExtension(new SnakeCaseExtension()); options.ConfigureWarnings(x => @@ -70,10 +67,6 @@ namespace Content.Server.Database .HasConversion(jsonConverter); } - public SqliteServerDbContext(DbContextOptions options) : base(options) - { - } - private static string InetToString(IPAddress address, int mask) { if (address.IsIPv4MappedToIPv6) { diff --git a/Content.Server/Database/ServerDbManager.cs b/Content.Server/Database/ServerDbManager.cs index a9549f4642..03fe97f637 100644 --- a/Content.Server/Database/ServerDbManager.cs +++ b/Content.Server/Database/ServerDbManager.cs @@ -180,12 +180,12 @@ namespace Content.Server.Database switch (engine) { case "sqlite": - var options = CreateSqliteOptions(); - _db = new ServerDbSqlite(options); + var sqliteOptions = CreateSqliteOptions(); + _db = new ServerDbSqlite(sqliteOptions); break; case "postgres": - options = CreatePostgresOptions(); - _db = new ServerDbPostgres(options); + var pgOptions = CreatePostgresOptions(); + _db = new ServerDbPostgres(pgOptions); break; default: throw new InvalidDataException($"Unknown database engine {engine}."); @@ -394,7 +394,7 @@ namespace Content.Server.Database return _db.RemoveFromWhitelistAsync(player); } - private DbContextOptions CreatePostgresOptions() + private DbContextOptions CreatePostgresOptions() { var host = _cfg.GetCVar(CCVars.DatabasePgHost); var port = _cfg.GetCVar(CCVars.DatabasePgPort); @@ -402,7 +402,7 @@ namespace Content.Server.Database var user = _cfg.GetCVar(CCVars.DatabasePgUsername); var pass = _cfg.GetCVar(CCVars.DatabasePgPassword); - var builder = new DbContextOptionsBuilder(); + var builder = new DbContextOptionsBuilder(); var connectionString = new NpgsqlConnectionStringBuilder { Host = host, @@ -419,9 +419,9 @@ namespace Content.Server.Database return builder.Options; } - private DbContextOptions CreateSqliteOptions() + private DbContextOptions CreateSqliteOptions() { - var builder = new DbContextOptionsBuilder(); + var builder = new DbContextOptionsBuilder(); var configPreferencesDbPath = _cfg.GetCVar(CCVars.DatabaseSqliteDbPath); var inMemory = _res.UserData.RootDir == null; @@ -447,7 +447,7 @@ namespace Content.Server.Database return builder.Options; } - private void SetupLogging(DbContextOptionsBuilder builder) + private void SetupLogging(DbContextOptionsBuilder builder) { builder.UseLoggerFactory(_msLoggerFactory); } diff --git a/Content.Server/Database/ServerDbPostgres.cs b/Content.Server/Database/ServerDbPostgres.cs index d1b73a64b9..82e64967e6 100644 --- a/Content.Server/Database/ServerDbPostgres.cs +++ b/Content.Server/Database/ServerDbPostgres.cs @@ -13,10 +13,10 @@ namespace Content.Server.Database { public sealed class ServerDbPostgres : ServerDbBase { - private readonly DbContextOptions _options; + private readonly DbContextOptions _options; private readonly Task _dbReadyTask; - public ServerDbPostgres(DbContextOptions options) + public ServerDbPostgres(DbContextOptions options) { _options = options; diff --git a/Content.Server/Database/ServerDbSqlite.cs b/Content.Server/Database/ServerDbSqlite.cs index b7ad7a2cfb..4b1d1a639a 100644 --- a/Content.Server/Database/ServerDbSqlite.cs +++ b/Content.Server/Database/ServerDbSqlite.cs @@ -31,7 +31,7 @@ namespace Content.Server.Database private readonly Task _dbReadyTask; private readonly SqliteServerDbContext _prefsCtx; - public ServerDbSqlite(DbContextOptions options) + public ServerDbSqlite(DbContextOptions options) { _prefsCtx = new SqliteServerDbContext(options); diff --git a/Content.Tests/Server/Preferences/ServerDbSqliteTests.cs b/Content.Tests/Server/Preferences/ServerDbSqliteTests.cs index 9bf1df1d16..35a321df81 100644 --- a/Content.Tests/Server/Preferences/ServerDbSqliteTests.cs +++ b/Content.Tests/Server/Preferences/ServerDbSqliteTests.cs @@ -67,7 +67,7 @@ namespace Content.Tests.Server.Preferences private static ServerDbSqlite GetDb() { - var builder = new DbContextOptionsBuilder(); + var builder = new DbContextOptionsBuilder(); var conn = new SqliteConnection("Data Source=:memory:"); conn.Open(); builder.UseSqlite(conn);