From 40932117c1e85b7cd1f8d21dbb7469e40d9ffd6c Mon Sep 17 00:00:00 2001 From: csharper2010 Date: Wed, 25 Nov 2020 17:17:42 +0100 Subject: [PATCH 1/4] Fixes #2621 Special treatment of enums mapped on string columns because all reasons for checking string lengths or streamlining the length of parameters of queries on string columns to the length of the column for SQL Server are also valid for enums because they are sometimes by convention used to model the possible values of a string column --- .../NHSpecificTest/GH2621Enum/Fixture.cs | 20 +++++++++++++++++++ .../GH2621Enum/Mappings.hbm.xml | 14 +++++++++++++ .../NHSpecificTest/GH2621Enum/Model.cs | 15 ++++++++++++++ src/NHibernate/Type/AbstractStringType.cs | 7 +++++-- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2621Enum/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2621Enum/Mappings.hbm.xml create mode 100644 src/NHibernate.Test/NHSpecificTest/GH2621Enum/Model.cs diff --git a/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Fixture.cs new file mode 100644 index 00000000000..0ec20886442 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Fixture.cs @@ -0,0 +1,20 @@ +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH2621Enum +{ + public class Fixture : BugTestCase + { + [Test] + public void TestOk() + { + using (var s = OpenSession()) + using (s.BeginTransaction()) + { + var query = s.CreateQuery( + @"SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2621Enum.ClassWithString ROOT WHERE ROOT.Kind = :kind"); + query.SetParameter("kind", Kind.SomeKind); + Assert.DoesNotThrow(() => query.List()); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Mappings.hbm.xml new file mode 100644 index 00000000000..0da735748dc --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Mappings.hbm.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Model.cs b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Model.cs new file mode 100644 index 00000000000..1a7cd35b5ff --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH2621Enum/Model.cs @@ -0,0 +1,15 @@ +namespace NHibernate.Test.NHSpecificTest.GH2621Enum +{ + public abstract class ClassWithString + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual string Kind { get; set; } + } + + public enum Kind + { + SomeKind, + SomeOtherKind + } +} diff --git a/src/NHibernate/Type/AbstractStringType.cs b/src/NHibernate/Type/AbstractStringType.cs index 267ccec6da5..3e5a22f6920 100644 --- a/src/NHibernate/Type/AbstractStringType.cs +++ b/src/NHibernate/Type/AbstractStringType.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Data.Common; using System.Globalization; @@ -58,13 +58,16 @@ public override void Set(DbCommand cmd, object value, int index, ISessionImpleme { var parameter = cmd.Parameters[index]; + if (value is Enum) + value = Enum.GetName(value.GetType(), value); + //Allow the driver to adjust the parameter for the value session.Factory.ConnectionProvider.Driver.AdjustParameterForValue(parameter, SqlType, value); // set the parameter value before the size check, since ODBC changes the size automatically parameter.Value = value; - if (parameter.Size > 0 && ((string)value).Length > parameter.Size) + if (parameter.Size > 0 && value != null && ((string) value).Length > parameter.Size) throw new HibernateException("The length of the string value exceeds the length configured in the mapping/parameter."); } From 03c8c144595f28cfdfed848ca1979f2a267639d6 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Thu, 27 Oct 2022 02:50:57 +0000 Subject: [PATCH 2/4] Apply suggestions from code review --- src/NHibernate/Type/AbstractStringType.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Type/AbstractStringType.cs b/src/NHibernate/Type/AbstractStringType.cs index 3e5a22f6920..abd2bfea326 100644 --- a/src/NHibernate/Type/AbstractStringType.cs +++ b/src/NHibernate/Type/AbstractStringType.cs @@ -58,8 +58,8 @@ public override void Set(DbCommand cmd, object value, int index, ISessionImpleme { var parameter = cmd.Parameters[index]; - if (value is Enum) - value = Enum.GetName(value.GetType(), value); + if (value is Enum e) + value = e.ToString(CultureInfo.InvariantCulture); //Allow the driver to adjust the parameter for the value session.Factory.ConnectionProvider.Driver.AdjustParameterForValue(parameter, SqlType, value); From 3392254cfabe33b3fa99f2c197e69027e4fc579d Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Thu, 27 Oct 2022 05:02:26 +0000 Subject: [PATCH 3/4] Do not call obsolete method --- src/NHibernate/Type/AbstractStringType.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Type/AbstractStringType.cs b/src/NHibernate/Type/AbstractStringType.cs index abd2bfea326..3b565214343 100644 --- a/src/NHibernate/Type/AbstractStringType.cs +++ b/src/NHibernate/Type/AbstractStringType.cs @@ -58,8 +58,8 @@ public override void Set(DbCommand cmd, object value, int index, ISessionImpleme { var parameter = cmd.Parameters[index]; - if (value is Enum e) - value = e.ToString(CultureInfo.InvariantCulture); + if (value is Enum) + value = value.ToString(); //Allow the driver to adjust the parameter for the value session.Factory.ConnectionProvider.Driver.AdjustParameterForValue(parameter, SqlType, value); From c4c77168dd82bca2727ad1ee686e342e50dd3cc6 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Fri, 28 Oct 2022 03:09:03 +0000 Subject: [PATCH 4/4] Apply suggestions from code review --- src/NHibernate/Type/AbstractStringType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate/Type/AbstractStringType.cs b/src/NHibernate/Type/AbstractStringType.cs index 3b565214343..9d47aaf07ff 100644 --- a/src/NHibernate/Type/AbstractStringType.cs +++ b/src/NHibernate/Type/AbstractStringType.cs @@ -67,7 +67,7 @@ public override void Set(DbCommand cmd, object value, int index, ISessionImpleme // set the parameter value before the size check, since ODBC changes the size automatically parameter.Value = value; - if (parameter.Size > 0 && value != null && ((string) value).Length > parameter.Size) + if (parameter.Size > 0 && ((string)value).Length > parameter.Size) throw new HibernateException("The length of the string value exceeds the length configured in the mapping/parameter."); }