diff --git a/doc/reference/modules/basic_mapping.xml b/doc/reference/modules/basic_mapping.xml index 122def3f62f..2056bbe27a4 100644 --- a/doc/reference/modules/basic_mapping.xml +++ b/doc/reference/modules/basic_mapping.xml @@ -3919,7 +3919,8 @@ CultureInfo System.Globalization.CultureInfo - DbType.String - 5 chars for culture + DbType.String - 5 chars for culture by default; + can be modified by the length mapping attribute. Default when no type attribute specified. diff --git a/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs index 4588e8d1017..4307080f4cf 100644 --- a/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs @@ -69,14 +69,10 @@ protected override void OnSetUp() protected override void OnTearDown() { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); - t.Commit(); - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); + t.Commit(); } protected override void DropSchema() diff --git a/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs new file mode 100644 index 00000000000..4ec37748718 --- /dev/null +++ b/src/NHibernate.Test/Async/TypesTest/CultureInfoTypeFixture.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// +// 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 System.Globalization; +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + using System.Threading.Tasks; + [TestFixture] + public class CultureInfoTypeFixtureAsync : TypeFixtureBase + { + protected override string TypeName => "CultureInfo"; + + [Test] + public async Task ReadWriteBasicCultureAsync() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US") }; + await (s.SaveAsync(entity)); + id = entity.Id; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture, Is.Not.Null); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("en-US")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US"))); + entity.BasicCulture = CultureInfo.GetCultureInfo("fr-BE"); + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("fr-BE")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("fr-BE"))); + entity.BasicCulture = null; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.BasicCulture, Is.Null); + await (t.CommitAsync()); + } + } + + [Test] + public async Task ReadWriteExtendedCultureAsync() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { ExtendedCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + await (s.SaveAsync(entity)); + id = entity.Id; + await (t.CommitAsync()); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = await (s.GetAsync(id)); + Assert.That(entity.ExtendedCulture, Is.Not.Null); + // Under Windows, it is named en-US-posix, but en-US-POSIX under Linux. + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix").IgnoreCase); + Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); + await (t.CommitAsync()); + } + } + + [Test] + public async Task WriteTooLongCultureAsync() + { + if (Dialect is SQLiteDialect) + Assert.Ignore("SQLite has no length limited string type."); + using var s = OpenSession(); + using var t = s.BeginTransaction(); + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + await (s.SaveAsync(entity)); + Assert.That(t.Commit, Throws.Exception); + } + } +} diff --git a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs index 64e62c0e326..1c604513d85 100644 --- a/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/DateTimeOffsetTypeFixture.cs @@ -69,18 +69,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeOffsetClass").ExecuteUpdate(); - t.Commit(); - } - } - protected override void DropSchema() { (Sfi.ConnectionProvider.Driver as ClientDriverWithParamsStats)?.CleanUp(); @@ -354,6 +342,14 @@ public class DateTimeOffsetTypeWithScaleFixtureAsync : DateTimeOffsetTypeFixture // The timestamp rounding in seeding does not account scale. protected override bool RevisionCheck => false; + protected override void OnTearDown() + { + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete DateTimeOffsetClass").ExecuteUpdate(); + t.Commit(); + } + [Test] public async Task LowerDigitsAreIgnoredAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs index c4ab2a0c6f0..1917cbd0b4b 100644 --- a/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/DecimalTypeFixture.cs @@ -54,18 +54,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DecimalClass").ExecuteUpdate(); - t.Commit(); - } - } - [Test] public async Task ReadWriteAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs index 255951b0b7a..1733fd0bce8 100644 --- a/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/EnumStringTypeFixture.cs @@ -40,14 +40,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from EnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public async Task ReadFromLoadAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs index 699ef01850b..06aa32c1ab7 100644 --- a/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/GenericEnumStringTypeFixture.cs @@ -42,14 +42,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from GenericEnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public async Task ReadFromLoadAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs index a7d74e58e4d..0808ca7e837 100644 --- a/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/StringTypeFixture.cs @@ -26,14 +26,6 @@ protected override string TypeName get { return "String"; } } - protected override void OnTearDown() - { - using (var s = OpenSession()) - { - s.CreateQuery("delete from StringClass").ExecuteUpdate(); - } - } - [Test] public async Task InsertNullValueAsync() { diff --git a/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs b/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs index 134fdee1b32..f9c585d7956 100644 --- a/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs +++ b/src/NHibernate.Test/Async/TypesTest/TimeAsTimeSpanTypeFixture.cs @@ -50,18 +50,6 @@ protected override string TypeName get { return "TimeAsTimeSpan"; } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var tx = s.BeginTransaction()) - { - s.CreateQuery("delete from TimeAsTimeSpanClass").ExecuteUpdate(); - tx.Commit(); - } - } - [Test] public async Task SavingAndRetrievingAsync() { diff --git a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs index 67b36a0d2cc..0d95535b947 100644 --- a/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs @@ -57,14 +57,10 @@ protected override void OnSetUp() protected override void OnTearDown() { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); - t.Commit(); - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete from DateTimeClass").ExecuteUpdate(); + t.Commit(); } protected override void DropSchema() diff --git a/src/NHibernate.Test/TypesTest/CultureInfoClass.cs b/src/NHibernate.Test/TypesTest/CultureInfoClass.cs new file mode 100644 index 00000000000..601cf00fbda --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoClass.cs @@ -0,0 +1,12 @@ +using System; +using System.Globalization; + +namespace NHibernate.Test.TypesTest +{ + public class CultureInfoClass + { + public Guid Id { get; set; } + public CultureInfo BasicCulture { get; set; } + public CultureInfo ExtendedCulture { get; set; } + } +} diff --git a/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml b/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml new file mode 100644 index 00000000000..8472d89d7f0 --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoClass.hbm.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs new file mode 100644 index 00000000000..d860c04ba1f --- /dev/null +++ b/src/NHibernate.Test/TypesTest/CultureInfoTypeFixture.cs @@ -0,0 +1,102 @@ +using System; +using System.Globalization; +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class CultureInfoTypeFixture : TypeFixtureBase + { + protected override string TypeName => "CultureInfo"; + + [Test] + public void ReadWriteBasicCulture() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US") }; + s.Save(entity); + id = entity.Id; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture, Is.Not.Null); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("en-US")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US"))); + entity.BasicCulture = CultureInfo.GetCultureInfo("fr-BE"); + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture.Name, Is.EqualTo("fr-BE")); + Assert.That(entity.BasicCulture, Is.EqualTo(CultureInfo.GetCultureInfo("fr-BE"))); + entity.BasicCulture = null; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.BasicCulture, Is.Null); + t.Commit(); + } + } + + [Test] + public void ReadWriteExtendedCulture() + { + Guid id; + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = new CultureInfoClass { ExtendedCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + s.Save(entity); + id = entity.Id; + t.Commit(); + } + + using (var s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var entity = s.Get(id); + Assert.That(entity.ExtendedCulture, Is.Not.Null); + // Under Windows, it is named en-US-posix, but en-US-POSIX under Linux. + Assert.That(entity.ExtendedCulture.Name, Is.EqualTo("en-US-posix").IgnoreCase); + Assert.That(entity.ExtendedCulture, Is.EqualTo(CultureInfo.GetCultureInfo("en-US-posix"))); + t.Commit(); + } + } + + [Test] + public void WriteTooLongCulture() + { + if (Dialect is SQLiteDialect) + Assert.Ignore("SQLite has no length limited string type."); + using var s = OpenSession(); + using var t = s.BeginTransaction(); + var entity = new CultureInfoClass { BasicCulture = CultureInfo.GetCultureInfo("en-US-posix") }; + s.Save(entity); + Assert.That(t.Commit, Throws.Exception); + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = Sfi.GetEntityPersister(typeof(CultureInfoClass).FullName).GetPropertyType(nameof(CultureInfoClass.BasicCulture)); + Assert.That(propertyType, Is.InstanceOf()); + } + } +} diff --git a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs index 0881a08e878..b38475b3a40 100644 --- a/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/DateTimeOffsetTypeFixture.cs @@ -57,18 +57,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DateTimeOffsetClass").ExecuteUpdate(); - t.Commit(); - } - } - protected override void DropSchema() { (Sfi.ConnectionProvider.Driver as ClientDriverWithParamsStats)?.CleanUp(); @@ -382,6 +370,14 @@ public class DateTimeOffsetTypeWithScaleFixture : DateTimeOffsetTypeFixture // The timestamp rounding in seeding does not account scale. protected override bool RevisionCheck => false; + protected override void OnTearDown() + { + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery("delete DateTimeOffsetClass").ExecuteUpdate(); + t.Commit(); + } + [Test] public void LowerDigitsAreIgnored() { diff --git a/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs b/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs index 72561fc7008..4f839a39df8 100644 --- a/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/DecimalTypeFixture.cs @@ -45,18 +45,6 @@ protected override void OnSetUp() } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var t = s.BeginTransaction()) - { - s.CreateQuery("delete from DecimalClass").ExecuteUpdate(); - t.Commit(); - } - } - /// /// Test that two decimal fields that are exactly equal are returned /// as Equal by the DecimalType. diff --git a/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs b/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs index ca3a07797df..9574983a65b 100644 --- a/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/EnumStringTypeFixture.cs @@ -29,14 +29,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from EnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public void ReadFromLoad() { diff --git a/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs b/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs index ea64fc18a2c..1ff4f62313a 100644 --- a/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs @@ -31,14 +31,6 @@ protected override void OnSetUp() s.Close(); } - protected override void OnTearDown() - { - ISession s = OpenSession(); - s.Delete("from GenericEnumStringClass"); - s.Flush(); - s.Close(); - } - [Test] public void ReadFromLoad() { diff --git a/src/NHibernate.Test/TypesTest/StringTypeFixture.cs b/src/NHibernate.Test/TypesTest/StringTypeFixture.cs index e544390e5ca..7a970476cfa 100644 --- a/src/NHibernate.Test/TypesTest/StringTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/StringTypeFixture.cs @@ -14,14 +14,6 @@ protected override string TypeName get { return "String"; } } - protected override void OnTearDown() - { - using (var s = OpenSession()) - { - s.CreateQuery("delete from StringClass").ExecuteUpdate(); - } - } - [Test] public void InsertNullValue() { diff --git a/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs b/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs index 5c0e2c364f0..4684693f498 100644 --- a/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs +++ b/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs @@ -38,18 +38,6 @@ protected override string TypeName get { return "TimeAsTimeSpan"; } } - protected override void OnTearDown() - { - base.OnTearDown(); - - using (var s = OpenSession()) - using (var tx = s.BeginTransaction()) - { - s.CreateQuery("delete from TimeAsTimeSpanClass").ExecuteUpdate(); - tx.Commit(); - } - } - [Test] public void PropertiesHasExpectedType() { diff --git a/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs b/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs index 048a3670b2d..6f83d6f8127 100644 --- a/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs +++ b/src/NHibernate.Test/TypesTest/TypeFixtureBase.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections; - namespace NHibernate.Test.TypesTest { /// @@ -13,20 +10,16 @@ public abstract class TypeFixtureBase : TestCase { protected abstract string TypeName { get; } - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } + protected override string MappingsAssembly => "NHibernate.Test"; + + protected override string[] Mappings => new[] { $"TypesTest.{TypeName}Class.hbm.xml" }; - protected override string[] Mappings + protected override void OnTearDown() { - get - { - return new string[] - { - String.Format("TypesTest.{0}Class.hbm.xml", TypeName) - }; - } + using var s = OpenSession(); + using var t = s.BeginTransaction(); + s.CreateQuery($"delete {TypeName}Class").ExecuteUpdate(); + t.Commit(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate/Type/CultureInfoType.cs b/src/NHibernate/Type/CultureInfoType.cs index 47daf666588..417e4b2ef89 100644 --- a/src/NHibernate/Type/CultureInfoType.cs +++ b/src/NHibernate/Type/CultureInfoType.cs @@ -8,12 +8,12 @@ namespace NHibernate.Type { /// - /// Maps a Property + /// Maps a Property /// to a column. /// /// /// CultureInfoType stores the culture name (not the Culture ID) of the - /// in the DB. + /// in the DB. /// [Serializable] public partial class CultureInfoType : ImmutableType, ILiteralType @@ -22,6 +22,10 @@ internal CultureInfoType() : base(new StringSqlType(5)) { } + internal CultureInfoType(StringSqlType sqlType) : base(sqlType) + { + } + /// public override object Get(DbDataReader rs, int index, ISessionImplementor session) { diff --git a/src/NHibernate/Type/TypeFactory.cs b/src/NHibernate/Type/TypeFactory.cs index 758353c48a4..0fd384d25c9 100644 --- a/src/NHibernate/Type/TypeFactory.cs +++ b/src/NHibernate/Type/TypeFactory.cs @@ -292,7 +292,9 @@ private static void RegisterDefaultNetTypes() RegisterType(typeof (Boolean), NHibernateUtil.Boolean, new[] { "boolean", "bool" }); RegisterType(typeof (Byte), NHibernateUtil.Byte, new[]{ "byte"}); RegisterType(typeof (Char), NHibernateUtil.Character, new[] {"character", "char"}); - RegisterType(typeof (CultureInfo), NHibernateUtil.CultureInfo, new[]{ "locale"}); + RegisterType(typeof (CultureInfo), NHibernateUtil.CultureInfo, new[] { "locale" }, + l => GetType(NHibernateUtil.CultureInfo, l, len => new CultureInfoType(SqlTypeFactory.GetString(len))), + false); RegisterType(typeof (DateTime), NHibernateUtil.DateTime, new[] { "datetime" }, s => GetType(NHibernateUtil.DateTime, s, scale => new DateTimeType(SqlTypeFactory.GetDateTime((byte)scale))), false); @@ -344,11 +346,10 @@ private static void RegisterDefaultNetTypes() } /// - /// Register other NO Default .NET type + /// Register types which are not a default for a .NET type. /// /// - /// These type will be used only when the "type" attribute was is specified in the mapping. - /// These are in here because needed to NO override default CLR types and be available in mappings + /// These types will be used only when the "type" attribute is specified in the mapping. /// private static void RegisterBuiltInTypes() {