From 084ca8afbfe12d33c66ada2c4ec8388a05ce34a6 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 18 Jan 2022 22:40:35 +1300 Subject: [PATCH 1/6] Fix validating similar column types --- .../PostgresSchemaValidateFixture.cs | 101 ++++++++++++++++++ .../PostgresSchemaValidateFixture.cs | 90 ++++++++++++++++ src/NHibernate/Mapping/Table.cs | 5 +- 3 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs create mode 100644 src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs new file mode 100644 index 00000000000..ff3a65461b7 --- /dev/null +++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System; +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Mapping.ByCode; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + using System.Threading.Tasks; + [TestFixture] + public class PostgresSchemaValidateFixtureAsync + { + [Test] + public async Task ShouldBeInvalidIfTimestampTzIsExpectedAndGotTimestampAsync() + { + var actual = BuildConfiguration("timestamp"); + Assume.That(Dialect.Dialect.GetDialect(actual.Properties) is PostgreSQLDialect); + + var expected = BuildConfiguration("timestamptz"); + + var export = new SchemaExport(actual); + await (export.CreateAsync(true, true)); + + try + { + var validator = new Tool.hbm2ddl.SchemaValidator(expected); + + var error = Assert.ThrowsAsync(() => validator.ValidateAsync()); + Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That( + error, + Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase + .And.Contains("for column CreatedAt. Found: timestamp, Expected timestamptz").IgnoreCase); + } + finally + { + await (export.DropAsync(true, true)); + } + } + + [Test] + public async Task ShouldBeInvalidIfTimestampIsExpectedAndGotTimestampTzAsync() + { + var actual = BuildConfiguration("timestamptz"); + Assume.That(Dialect.Dialect.GetDialect(actual.Properties) is PostgreSQLDialect); + + var expected = BuildConfiguration("timestamp"); + + var export = new SchemaExport(actual); + await (export.CreateAsync(true, true)); + + try + { + var validator = new Tool.hbm2ddl.SchemaValidator(expected); + + var error = Assert.ThrowsAsync(() => validator.ValidateAsync()); + Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That( + error, + Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase + .And.Contains("for column CreatedAt. Found: timestamptz, Expected timestamp").IgnoreCase); + } + finally + { + await (export.DropAsync(true, true)); + } + } + + private static Configuration BuildConfiguration(string type) + { + var mapper = new ModelMapper(); + mapper.Class(c => + { + c.Table("Entity"); + c.Id(x => x.Id); + c.Property(x => x.CreatedAt, p => p.Column(cm => cm.SqlType(type))); + }); + + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddDeserializedMapping(mapper.CompileMappingForAllExplicitlyAddedEntities(), "Entity"); + return cfg; + } + + public class Entity + { + public virtual int Id { get; set; } + public virtual DateTime CreatedAt { get; set; } + } + } +} diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs new file mode 100644 index 00000000000..da8e84cd318 --- /dev/null +++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs @@ -0,0 +1,90 @@ +using System; +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Mapping.ByCode; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + [TestFixture] + public class PostgresSchemaValidateFixture + { + [Test] + public void ShouldBeInvalidIfTimestampTzIsExpectedAndGotTimestamp() + { + var actual = BuildConfiguration("timestamp"); + Assume.That(Dialect.Dialect.GetDialect(actual.Properties) is PostgreSQLDialect); + + var expected = BuildConfiguration("timestamptz"); + + var export = new SchemaExport(actual); + export.Create(true, true); + + try + { + var validator = new Tool.hbm2ddl.SchemaValidator(expected); + + var error = Assert.Throws(() => validator.Validate()); + Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That( + error, + Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase + .And.Contains("for column CreatedAt. Found: timestamp, Expected timestamptz").IgnoreCase); + } + finally + { + export.Drop(true, true); + } + } + + [Test] + public void ShouldBeInvalidIfTimestampIsExpectedAndGotTimestampTz() + { + var actual = BuildConfiguration("timestamptz"); + Assume.That(Dialect.Dialect.GetDialect(actual.Properties) is PostgreSQLDialect); + + var expected = BuildConfiguration("timestamp"); + + var export = new SchemaExport(actual); + export.Create(true, true); + + try + { + var validator = new Tool.hbm2ddl.SchemaValidator(expected); + + var error = Assert.Throws(() => validator.Validate()); + Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That( + error, + Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase + .And.Contains("for column CreatedAt. Found: timestamptz, Expected timestamp").IgnoreCase); + } + finally + { + export.Drop(true, true); + } + } + + private static Configuration BuildConfiguration(string type) + { + var mapper = new ModelMapper(); + mapper.Class(c => + { + c.Table("Entity"); + c.Id(x => x.Id); + c.Property(x => x.CreatedAt, p => p.Column(cm => cm.SqlType(type))); + }); + + var cfg = TestConfigurationHelper.GetDefaultConfiguration(); + cfg.AddDeserializedMapping(mapper.CompileMappingForAllExplicitlyAddedEntities(), "Entity"); + return cfg; + } + + public class Entity + { + public virtual int Id { get; set; } + public virtual DateTime CreatedAt { get; set; } + } + } +} diff --git a/src/NHibernate/Mapping/Table.cs b/src/NHibernate/Mapping/Table.cs index 3082a9c02b0..3c024ad1008 100644 --- a/src/NHibernate/Mapping/Table.cs +++ b/src/NHibernate/Mapping/Table.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using NHibernate.Dialect.Schema; using NHibernate.Engine; using NHibernate.Util; @@ -1035,7 +1036,9 @@ public IEnumerable ValidateColumns(Dialect.Dialect dialect, IMapping map } //TODO: Add new method to ColumnMetadata :getTypeCode - bool typesMatch = column.GetSqlType(dialect, mapping).StartsWith(columnInfo.TypeName, StringComparison.OrdinalIgnoreCase); + var typesMatch = Regex.IsMatch( + column.GetSqlType(dialect, mapping), + $@"^{Regex.Escape(columnInfo.TypeName)}\b"); //|| columnInfo.get() == column.GetSqlTypeCode(mapping); if (!typesMatch) { From abf1d114e8afe96d7506316a2ac9ac872552d783 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 18 Jan 2022 23:44:48 +1300 Subject: [PATCH 2/6] Fix issue with case and Turkish culture --- .../Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs | 2 +- .../Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs | 2 +- src/NHibernate/Mapping/Table.cs | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs index a8809777bba..52094bb67f7 100644 --- a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs +++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs @@ -52,7 +52,7 @@ public async Task ShouldVerifySameTableAsync() await (validator.ValidateAsync()); } - [Test, SetCulture("tr-TR"), SetUICulture("tr-TR"), NetFxOnly] + [Test, SetCulture("tr-TR"), SetUICulture("tr-TR")] public async Task ShouldVerifySameTableTurkishAsync() { //NH-3063 diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs index ba8686986b4..72d244ca927 100644 --- a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs +++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs @@ -41,7 +41,7 @@ public void ShouldVerifySameTable() validator.Validate(); } - [Test, SetCulture("tr-TR"), SetUICulture("tr-TR"), NetFxOnly] + [Test, SetCulture("tr-TR"), SetUICulture("tr-TR")] public void ShouldVerifySameTableTurkish() { //NH-3063 diff --git a/src/NHibernate/Mapping/Table.cs b/src/NHibernate/Mapping/Table.cs index 3c024ad1008..2c48a50624e 100644 --- a/src/NHibernate/Mapping/Table.cs +++ b/src/NHibernate/Mapping/Table.cs @@ -1038,7 +1038,8 @@ public IEnumerable ValidateColumns(Dialect.Dialect dialect, IMapping map //TODO: Add new method to ColumnMetadata :getTypeCode var typesMatch = Regex.IsMatch( column.GetSqlType(dialect, mapping), - $@"^{Regex.Escape(columnInfo.TypeName)}\b"); + $@"^{Regex.Escape(columnInfo.TypeName)}\b", + RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); //|| columnInfo.get() == column.GetSqlTypeCode(mapping); if (!typesMatch) { From 375c032429381a3ddc5141729df71c0207cd77d6 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Wed, 19 Jan 2022 00:41:35 +1300 Subject: [PATCH 3/6] Display validation errors --- src/NHibernate/SchemaValidationException.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/NHibernate/SchemaValidationException.cs b/src/NHibernate/SchemaValidationException.cs index 2d654a07583..6a9cb0d7869 100644 --- a/src/NHibernate/SchemaValidationException.cs +++ b/src/NHibernate/SchemaValidationException.cs @@ -28,5 +28,17 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont base.GetObjectData(info, context); info.AddValue("ValidationErrors", ValidationErrors); } + + public override string Message + { + get + { + var message = base.Message; + if (ValidationErrors == null || ValidationErrors.Count == 0) + return message; + var errors = "ValidationErrors:" + string.Join(Environment.NewLine + "- ", ValidationErrors); + return message + Environment.NewLine + errors; + } + } } } From 7ad074d59e1487963a1443c954077827200731cf Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Wed, 26 Jan 2022 23:50:57 +1300 Subject: [PATCH 4/6] Improve error message for SchemaValidationException --- .../NH1274ExportExclude/NH1274ExportExcludeFixture.cs | 2 +- .../SchemaValidator/PostgresSchemaValidateFixture.cs | 4 ++-- .../hbm2ddl/SchemaValidator/SchemaValidateFixture.cs | 4 ++-- .../NH1274ExportExclude/NH1274ExportExcludeFixture.cs | 2 +- .../SchemaValidator/PostgresSchemaValidateFixture.cs | 4 ++-- .../hbm2ddl/SchemaValidator/SchemaValidateFixture.cs | 4 ++-- src/NHibernate/SchemaValidationException.cs | 9 +++++++-- 7 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs index cdcd11bb2f2..0a08de25c46 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs @@ -95,7 +95,7 @@ public void SchemaExport_Validate_CausesValidateExceptionAsync() Assert.That( () => validator.ValidateAsync(), Throws.TypeOf() - .And.Message.EqualTo("Schema validation failed: see list of validation errors") + .And.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Contains("Missing table: Home_Validate")); } diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs index ff3a65461b7..6dd25fbf690 100644 --- a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs +++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs @@ -37,7 +37,7 @@ public async Task ShouldBeInvalidIfTimestampTzIsExpectedAndGotTimestampAsync() var validator = new Tool.hbm2ddl.SchemaValidator(expected); var error = Assert.ThrowsAsync(() => validator.ValidateAsync()); - Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That(error, Has.Message.StartsWith("Schema validation failed: see list of validation errors")); Assert.That( error, Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase @@ -65,7 +65,7 @@ public async Task ShouldBeInvalidIfTimestampIsExpectedAndGotTimestampTzAsync() var validator = new Tool.hbm2ddl.SchemaValidator(expected); var error = Assert.ThrowsAsync(() => validator.ValidateAsync()); - Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That(error, Has.Message.StartsWith("Schema validation failed: see list of validation errors")); Assert.That( error, Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase diff --git a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs index 52094bb67f7..948e8ee7a59 100644 --- a/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs +++ b/src/NHibernate.Test/Async/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs @@ -90,7 +90,7 @@ public void ShouldNotVerifyModifiedTableAsync() Assert.That( () => validatorV2.ValidateAsync(), Throws.TypeOf() - .And.Message.EqualTo("Schema validation failed: see list of validation errors") + .And.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase); } @@ -103,7 +103,7 @@ public void ShouldNotVerifyMultiModifiedTableAsync() var error = Assert.ThrowsAsync(() => validator.ValidateAsync()); Assert.That(error, - Has.Message.EqualTo("Schema validation failed: see list of validation errors") + Has.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase); Assert.That(error, Has.Property("ValidationErrors").Some.Contains("Missing column: Title in ").IgnoreCase.And.Contains("Version").IgnoreCase); diff --git a/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs index 3cc8b6df1dc..95eebe4301c 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs @@ -84,7 +84,7 @@ public void SchemaExport_Validate_CausesValidateException() Assert.That( () => validator.Validate(), Throws.TypeOf() - .And.Message.EqualTo("Schema validation failed: see list of validation errors") + .And.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Contains("Missing table: Home_Validate")); } diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs index da8e84cd318..fe236739417 100644 --- a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs +++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/PostgresSchemaValidateFixture.cs @@ -26,7 +26,7 @@ public void ShouldBeInvalidIfTimestampTzIsExpectedAndGotTimestamp() var validator = new Tool.hbm2ddl.SchemaValidator(expected); var error = Assert.Throws(() => validator.Validate()); - Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That(error, Has.Message.StartsWith("Schema validation failed: see list of validation errors")); Assert.That( error, Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase @@ -54,7 +54,7 @@ public void ShouldBeInvalidIfTimestampIsExpectedAndGotTimestampTz() var validator = new Tool.hbm2ddl.SchemaValidator(expected); var error = Assert.Throws(() => validator.Validate()); - Assert.That(error, Has.Message.EqualTo("Schema validation failed: see list of validation errors")); + Assert.That(error, Has.Message.StartsWith("Schema validation failed: see list of validation errors")); Assert.That( error, Has.Property("ValidationErrors").Some.Contains("Wrong column type").IgnoreCase diff --git a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs index 72d244ca927..bded7d7236b 100644 --- a/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs +++ b/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs @@ -79,7 +79,7 @@ public void ShouldNotVerifyModifiedTable() Assert.That( () => validatorV2.Validate(), Throws.TypeOf() - .And.Message.EqualTo("Schema validation failed: see list of validation errors") + .And.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase); } @@ -92,7 +92,7 @@ public void ShouldNotVerifyMultiModifiedTable() var error = Assert.Throws(() => validator.Validate()); Assert.That(error, - Has.Message.EqualTo("Schema validation failed: see list of validation errors") + Has.Message.StartsWith("Schema validation failed: see list of validation errors") .And.Property("ValidationErrors").Some.Contains("Missing column: Name in ").IgnoreCase.And.Contains("Version").IgnoreCase); Assert.That(error, Has.Property("ValidationErrors").Some.Contains("Missing column: Title in ").IgnoreCase.And.Contains("Version").IgnoreCase); diff --git a/src/NHibernate/SchemaValidationException.cs b/src/NHibernate/SchemaValidationException.cs index 6a9cb0d7869..232f14dd0aa 100644 --- a/src/NHibernate/SchemaValidationException.cs +++ b/src/NHibernate/SchemaValidationException.cs @@ -3,6 +3,7 @@ using System.Collections.ObjectModel; using System.Runtime.Serialization; using System.Security; +using System.Text; namespace NHibernate { @@ -36,8 +37,12 @@ public override string Message var message = base.Message; if (ValidationErrors == null || ValidationErrors.Count == 0) return message; - var errors = "ValidationErrors:" + string.Join(Environment.NewLine + "- ", ValidationErrors); - return message + Environment.NewLine + errors; + + var sb = new StringBuilder(message).AppendLine().AppendLine("Validation errors:"); + foreach (var error in ValidationErrors) + sb.Append('-').AppendLine(error); + + return sb.ToString(); } } } From 4e071d814f35e65dfd973b6ac2df79fdc66d7568 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Thu, 27 Jan 2022 00:09:06 +1300 Subject: [PATCH 5/6] Aesthetic change to the error message --- src/NHibernate/SchemaValidationException.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/SchemaValidationException.cs b/src/NHibernate/SchemaValidationException.cs index 232f14dd0aa..29cb9a12e67 100644 --- a/src/NHibernate/SchemaValidationException.cs +++ b/src/NHibernate/SchemaValidationException.cs @@ -40,8 +40,8 @@ public override string Message var sb = new StringBuilder(message).AppendLine().AppendLine("Validation errors:"); foreach (var error in ValidationErrors) - sb.Append('-').AppendLine(error); - + sb.Append("\t- ").AppendLine(error); + return sb.ToString(); } } From fe20c5f5252f01ef24d9aaa9669089525c18509d Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Fri, 28 Jan 2022 13:53:49 +1300 Subject: [PATCH 6/6] Oracle, go home, you're drunk --- src/NHibernate/Mapping/Table.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/NHibernate/Mapping/Table.cs b/src/NHibernate/Mapping/Table.cs index 2c48a50624e..d20bb372c33 100644 --- a/src/NHibernate/Mapping/Table.cs +++ b/src/NHibernate/Mapping/Table.cs @@ -1036,10 +1036,13 @@ public IEnumerable ValidateColumns(Dialect.Dialect dialect, IMapping map } //TODO: Add new method to ColumnMetadata :getTypeCode - var typesMatch = Regex.IsMatch( - column.GetSqlType(dialect, mapping), - $@"^{Regex.Escape(columnInfo.TypeName)}\b", - RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); + var columnType = column.GetSqlType(dialect, mapping); + var typesMatch = + string.Equals(columnType, columnInfo.TypeName, StringComparison.OrdinalIgnoreCase) || + Regex.IsMatch( + columnType, + $@"^{Regex.Escape(columnInfo.TypeName)}\b", + RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); //|| columnInfo.get() == column.GetSqlTypeCode(mapping); if (!typesMatch) { @@ -1049,7 +1052,7 @@ public IEnumerable ValidateColumns(Dialect.Dialect dialect, IMapping map dialect.Qualify(tableInfo.Catalog, tableInfo.Schema, tableInfo.Name), column.Name, columnInfo.TypeName.ToLowerInvariant(), - column.GetSqlType(dialect, mapping))); + columnType)); } }