diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3643/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3643/FixtureByCode.cs
new file mode 100644
index 0000000000..7f40824898
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3643/FixtureByCode.cs
@@ -0,0 +1,130 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by AsyncGenerator.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+
+using System.Linq;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Linq;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3643
+{
+	using System.Threading.Tasks;
+	using System.Threading;
+	[TestFixture]
+	public class FixtureByCodeAsync : TestCaseMappingByCode
+	{
+		protected override void Configure(Configuration configuration)
+		{
+			configuration.SetProperty(Environment.UseQueryCache, "true");
+			configuration.SetProperty(Environment.GenerateStatistics, "true");
+		}
+
+		protected override HbmMapping GetMappings()
+		{
+			var mapper = new ModelMapper();
+
+			mapper.Class<Entity>(
+				rc =>
+				{
+					rc.Id(x => x.Id);
+					rc.Bag(
+						x => x.Children,
+						m =>
+						{
+							m.Access(Accessor.Field);
+							m.Key(k => k.Column("EntityId"));
+						},
+						r => r.OneToMany());
+			
+					rc.Cache(
+						cm =>
+						{
+							cm.Include(CacheInclude.All);
+							cm.Usage(CacheUsage.ReadWrite);
+						});
+				});
+
+			mapper.Class<ChildEntity>(
+				rc =>
+				{
+					rc.Id(x => x.Id);
+					rc.Cache(
+						cm =>
+						{
+							cm.Include(CacheInclude.All);
+							cm.Usage(CacheUsage.ReadWrite);
+						});
+				});
+
+			return mapper.CompileMappingForAllExplicitlyAddedEntities();
+		}
+
+		protected override void OnSetUp()
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+			
+			session.CreateSQLQuery(
+				"INSERT INTO Entity (Id) VALUES (0)"
+			).ExecuteUpdate();
+
+			session.CreateSQLQuery(
+				"INSERT INTO ChildEntity (Id, EntityId) VALUES (0, 0)"
+			).ExecuteUpdate();
+
+			session.CreateSQLQuery(
+				"INSERT INTO ChildEntity (Id, EntityId) VALUES (1, 0)"
+			).ExecuteUpdate();
+			
+			transaction.Commit();
+		}
+
+		protected override void OnTearDown()
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+
+			session.CreateSQLQuery("DELETE FROM ChildEntity").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Entity").ExecuteUpdate();
+
+			transaction.Commit();
+		}
+	
+		[Test]
+		public async Task LoadsEntityWithEnumIdAndChildrenUsingQueryCacheAsync()
+		{
+			await (LoadEntityWithQueryCacheAsync()); // warm up cache
+
+			var entity = await (LoadEntityWithQueryCacheAsync());
+
+			Assert.That(entity.Children.Count(), Is.EqualTo(2));
+			
+			Assert.That(Sfi.Statistics.QueryExecutionCount, Is.EqualTo(1), "Unexpected execution count");
+			Assert.That(Sfi.Statistics.QueryCachePutCount, Is.EqualTo(1), "Unexpected cache put count");
+			Assert.That(Sfi.Statistics.QueryCacheHitCount, Is.EqualTo(1), "Unexpected cache hit count");
+		}
+		
+		private async Task<Entity> LoadEntityWithQueryCacheAsync(CancellationToken cancellationToken = default(CancellationToken))
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+			var entity = (await (session
+			          .Query<Entity>()
+			          .FetchMany(x => x.Children)
+			          .WithOptions(opt => opt.SetCacheable(true))
+			          .ToListAsync(cancellationToken)))[0];
+			
+			await (transaction.CommitAsync(cancellationToken));
+			return entity;
+		}
+	}
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3643/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH3643/Entity.cs
new file mode 100644
index 0000000000..60a3de3c86
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3643/Entity.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+// ReSharper disable CollectionNeverUpdated.Local
+// ReSharper disable UnassignedGetOnlyAutoProperty
+
+namespace NHibernate.Test.NHSpecificTest.GH3643
+{
+	class Entity
+	{
+		private readonly ICollection<ChildEntity> _children = new List<ChildEntity>();
+		public virtual EntityId Id { get; protected set; }
+		public virtual IEnumerable<ChildEntity> Children => _children.AsEnumerable();
+	}
+
+	class ChildEntity
+	{
+		public virtual int Id { get; protected set; }
+	}
+
+	enum EntityId
+	{
+		Id1,
+		Id2
+	}
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH3643/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3643/FixtureByCode.cs
new file mode 100644
index 0000000000..c2694e3b63
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH3643/FixtureByCode.cs
@@ -0,0 +1,118 @@
+using System.Linq;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Linq;
+using NHibernate.Mapping.ByCode;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH3643
+{
+	[TestFixture]
+	public class FixtureByCode : TestCaseMappingByCode
+	{
+		protected override void Configure(Configuration configuration)
+		{
+			configuration.SetProperty(Environment.UseQueryCache, "true");
+			configuration.SetProperty(Environment.GenerateStatistics, "true");
+		}
+
+		protected override HbmMapping GetMappings()
+		{
+			var mapper = new ModelMapper();
+
+			mapper.Class<Entity>(
+				rc =>
+				{
+					rc.Id(x => x.Id);
+					rc.Bag(
+						x => x.Children,
+						m =>
+						{
+							m.Access(Accessor.Field);
+							m.Key(k => k.Column("EntityId"));
+						},
+						r => r.OneToMany());
+			
+					rc.Cache(
+						cm =>
+						{
+							cm.Include(CacheInclude.All);
+							cm.Usage(CacheUsage.ReadWrite);
+						});
+				});
+
+			mapper.Class<ChildEntity>(
+				rc =>
+				{
+					rc.Id(x => x.Id);
+					rc.Cache(
+						cm =>
+						{
+							cm.Include(CacheInclude.All);
+							cm.Usage(CacheUsage.ReadWrite);
+						});
+				});
+
+			return mapper.CompileMappingForAllExplicitlyAddedEntities();
+		}
+
+		protected override void OnSetUp()
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+			
+			session.CreateSQLQuery(
+				"INSERT INTO Entity (Id) VALUES (0)"
+			).ExecuteUpdate();
+
+			session.CreateSQLQuery(
+				"INSERT INTO ChildEntity (Id, EntityId) VALUES (0, 0)"
+			).ExecuteUpdate();
+
+			session.CreateSQLQuery(
+				"INSERT INTO ChildEntity (Id, EntityId) VALUES (1, 0)"
+			).ExecuteUpdate();
+			
+			transaction.Commit();
+		}
+
+		protected override void OnTearDown()
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+
+			session.CreateSQLQuery("DELETE FROM ChildEntity").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Entity").ExecuteUpdate();
+
+			transaction.Commit();
+		}
+	
+		[Test]
+		public void LoadsEntityWithEnumIdAndChildrenUsingQueryCache()
+		{
+			LoadEntityWithQueryCache(); // warm up cache
+
+			var entity = LoadEntityWithQueryCache();
+
+			Assert.That(entity.Children.Count(), Is.EqualTo(2));
+			
+			Assert.That(Sfi.Statistics.QueryExecutionCount, Is.EqualTo(1), "Unexpected execution count");
+			Assert.That(Sfi.Statistics.QueryCachePutCount, Is.EqualTo(1), "Unexpected cache put count");
+			Assert.That(Sfi.Statistics.QueryCacheHitCount, Is.EqualTo(1), "Unexpected cache hit count");
+		}
+		
+		private Entity LoadEntityWithQueryCache()
+		{
+			using var session = OpenSession();
+			using var transaction = session.BeginTransaction();
+			var entity = session
+			          .Query<Entity>()
+			          .FetchMany(x => x.Children)
+			          .WithOptions(opt => opt.SetCacheable(true))
+			          .ToList()[0];
+			
+			transaction.Commit();
+			return entity;
+		}
+	}
+}
diff --git a/src/NHibernate.sln.DotSettings b/src/NHibernate.sln.DotSettings
index d78384192e..b77ef433c2 100644
--- a/src/NHibernate.sln.DotSettings
+++ b/src/NHibernate.sln.DotSettings
@@ -21,6 +21,9 @@
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=15b5b1f1_002D457c_002D4ca6_002Db278_002D5615aedc07d3/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=236f7aa5_002D7b06_002D43ca_002Dbf2a_002D9b31bfcff09a/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="CONSTANT_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=4a98fdf6_002D7d98_002D4f5a_002Dafeb_002Dea44ad98c70c/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
@@ -29,6 +32,7 @@
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002EFormat_002ESettingsUpgrade_002EAlignmentTabFillStyleMigration/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/UnitTesting/SeparateAppDomainPerAssembly/@EntryValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=0BE95D01E0F2244E97F5FEFAD1EB1A63/@KeyIndexDefined">True</s:Boolean>