diff --git a/src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs b/src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs index fe1c9905f..7bcc5b51a 100644 --- a/src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs +++ b/src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs @@ -400,8 +400,7 @@ ORDER BY attnum else { column.DefaultValueSql = defaultValueSql; - column.DefaultValue = ParseClrDefault(systemTypeName, defaultValueSql); - AdjustDefaults(column, systemTypeName); + column.DefaultValue = ParseDefaultValueSql(systemTypeName, defaultValueSql); } // Identify IDENTITY columns, as well as SERIAL ones. @@ -503,7 +502,7 @@ ORDER BY attnum } } - private static object? ParseClrDefault(string dataTypeName, string? defaultValueSql) + private static object? ParseDefaultValueSql(string systemTypeName, string? defaultValueSql) { defaultValueSql = defaultValueSql?.Trim(); @@ -514,10 +513,10 @@ ORDER BY attnum while (defaultValueSql.StartsWith('(') && defaultValueSql.EndsWith(')')) { - defaultValueSql = defaultValueSql.Substring(1, defaultValueSql.Length - 2).Trim(); + defaultValueSql = defaultValueSql[1..^1].Trim(); } - return dataTypeName switch + return systemTypeName switch { "bool" or "boolean" => defaultValueSql switch { @@ -525,11 +524,12 @@ ORDER BY attnum "false" or "no" or "off" or "0" => false, _ => null }, + "smallint" or "int2" => short.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @short) ? @short : null, "integer" or "int" or "int4" => int.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @int) ? @int : null, "bigint" or "int8" => long.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @long) ? @long : null, - "real" or "float4"=> float.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @float) ? @float : null, + "real" or "float4" => float.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @float) ? @float : null, "double precision" or "float8" => double.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @double) ? @double : null, "numeric" or "decimal" => decimal.TryParse(defaultValueSql, CultureInfo.InvariantCulture, out var @decimal) ? @decimal : null, @@ -1238,55 +1238,7 @@ nspname NOT IN ({internalSchemas}) #endregion - #region Configure default values - - /// - /// Configures the default value for a column. - /// - /// The column to configure. - /// The type name of the column. - private static void AdjustDefaults(DatabaseColumn column, string systemTypeName) - { - var defaultValue = column.DefaultValueSql; - if (defaultValue is null or "(NULL)") - { - column.DefaultValueSql = null; - return; - } - - if (column.IsNullable) - { - return; - } - - if (defaultValue == "0") - { - if (systemTypeName is "float4" or "float8" or "int2" or "int4" or "int8" or "money" or "numeric") - { - column.DefaultValueSql = null; - return; - } - } - - if (defaultValue is "0.0" or "'0'::numeric") - { - if (systemTypeName is "numeric" or "float4" or "float8" or "money") - { - column.DefaultValueSql = null; - return; - } - } - - if (systemTypeName == "bool" && defaultValue == "false" - || systemTypeName == "date" && defaultValue == "'0001-01-01'::date" - || systemTypeName == "timestamp" && defaultValue == "'1900-01-01 00:00:00'::timestamp without time zone" - || systemTypeName == "time" && defaultValue == "'00:00:00'::time without time zone" - || systemTypeName == "interval" && defaultValue == "'00:00:00'::interval" - || systemTypeName == "uuid" && defaultValue == "'00000000-0000-0000-0000-000000000000'::uuid") - { - column.DefaultValueSql = null; - } - } + #region SequenceInfo private static SequenceInfo ReadSequenceInfo(DbDataRecord record, Version postgresVersion) { diff --git a/test/EFCore.PG.FunctionalTests/Scaffolding/NpgsqlDatabaseModelFactoryTest.cs b/test/EFCore.PG.FunctionalTests/Scaffolding/NpgsqlDatabaseModelFactoryTest.cs index 7d55c9a89..7cdfe3d88 100644 --- a/test/EFCore.PG.FunctionalTests/Scaffolding/NpgsqlDatabaseModelFactoryTest.cs +++ b/test/EFCore.PG.FunctionalTests/Scaffolding/NpgsqlDatabaseModelFactoryTest.cs @@ -934,50 +934,6 @@ public void Computed_values_are_stored() DROP TABLE "ComputedValues" """); - [Fact] - public void Default_value_matching_clr_default_is_not_stored() - => Test( - """ -CREATE DOMAIN "decimalDomain" AS decimal(6); - -CREATE TABLE "DefaultValues" ( - "IgnoredDefault1" int DEFAULT NULL, - "IgnoredDefault2" int NOT NULL DEFAULT NULL, - "IgnoredDefault9" int NOT NULL DEFAULT 0, - "IgnoredDefault14" smallint NOT NULL DEFAULT 0, - "IgnoredDefault3" bigint NOT NULL DEFAULT 0, - "IgnoredDefault15" decimal NOT NULL DEFAULT 0, - "IgnoredDefault16" decimal NOT NULL DEFAULT 0.0, - "IgnoredDefault17" "decimalDomain" NOT NULL DEFAULT 0, - "IgnoredDefault10" money NOT NULL DEFAULT 0, - "IgnoredDefault19" money NOT NULL DEFAULT 0.0, - "IgnoredDefault21" float4 NOT NULL DEFAULT 0.0, - "IgnoredDefault7" float8 NOT NULL DEFAULT 0, - "IgnoredDefault18" float8 NOT NULL DEFAULT 0.0, - "IgnoredDefault24" float8 NOT NULL DEFAULT 0E0, - "IgnoredDefault4" bool NOT NULL DEFAULT false, - "IgnoredDefault25" date NOT NULL DEFAULT '0001-01-01', - "IgnoredDefault26" timestamp NOT NULL DEFAULT '1900-01-01T00:00:00.000', - "IgnoredDefault27" interval NOT NULL DEFAULT '00:00:00', - "IgnoredDefault32" time NOT NULL DEFAULT '00:00:00', - "IgnoredDefault34" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' -) -""", - [], - [], - dbModel => - { - var columns = dbModel.Tables.Single().Columns; - - Assert.All( - columns, - t => Assert.Null(t.DefaultValueSql)); - }, - """ -DROP TABLE "DefaultValues"; -DROP DOMAIN "decimalDomain"; -"""); - [Fact] public void ValueGenerated_is_set_for_default_and_serial_column() => Test(