diff --git a/build-common/NHibernate.props b/build-common/NHibernate.props index f0caa03e318..d93d4ba1ab1 100644 --- a/build-common/NHibernate.props +++ b/build-common/NHibernate.props @@ -3,9 +3,9 @@ 5.3 - 13 + 14 - + dev $(NhVersion).$(VersionPatch) $(VersionSuffix).$(BuildNumber) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3164/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3164/FixtureByCode.cs new file mode 100644 index 00000000000..cf8f572cee7 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3164/FixtureByCode.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// +// 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.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using NHibernate.Linq; + +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + using System.Threading.Tasks; + [TestFixture] + public class ByCodeFixtureAsync : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.AddMapping(); + mapper.AddMapping(); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var e1 = new ContentItem { Name = "Test" }; + session.Save(e1); + + transaction.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + } + + [Test] + public async Task FetchComponentAsync() + { + using (var session = OpenSession()) + { + var result = await (session.Query().Fetch(i => i.Head).ToListAsync()); + + Assert.That(result.Count, Is.EqualTo(1)); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItem.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItem.cs new file mode 100644 index 00000000000..523b9245586 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItem.cs @@ -0,0 +1,9 @@ +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + public class ContentItem + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + public virtual IHead Head { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItemMapping.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItemMapping.cs new file mode 100644 index 00000000000..af995adc917 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/ContentItemMapping.cs @@ -0,0 +1,16 @@ +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Conformist; + +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + public class ContentItemMapping : ClassMapping + { + public ContentItemMapping() + { + Table("ContentItems"); + Id(x => x.Id, m => m.Generator(Generators.Identity)); + Property(x => x.Name); + Component(x => x.Head, x => x.Lazy(true)); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/FixtureByCode.cs new file mode 100644 index 00000000000..e5e8e800c9f --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/FixtureByCode.cs @@ -0,0 +1,55 @@ +using System.Linq; +using NHibernate.Cfg.MappingSchema; +using NHibernate.Mapping.ByCode; +using NUnit.Framework; +using NHibernate.Linq; + +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + [TestFixture] + public class ByCodeFixture : TestCaseMappingByCode + { + protected override HbmMapping GetMappings() + { + var mapper = new ModelMapper(); + mapper.AddMapping(); + mapper.AddMapping(); + + return mapper.CompileMappingForAllExplicitlyAddedEntities(); + } + + protected override void OnSetUp() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var e1 = new ContentItem { Name = "Test" }; + session.Save(e1); + + transaction.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = OpenSession()) + using (var transaction = session.BeginTransaction()) + { + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + } + + [Test] + public void FetchComponent() + { + using (var session = OpenSession()) + { + var result = session.Query().Fetch(i => i.Head).ToList(); + + Assert.That(result.Count, Is.EqualTo(1)); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/Head.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/Head.cs new file mode 100644 index 00000000000..4166a33880c --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/Head.cs @@ -0,0 +1,12 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + [Serializable] + public class Head : IHead + { + public virtual string Title { get; set; } + + public virtual bool DummyFieldToLoadEmptyComponent { get; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/HeadMapping.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/HeadMapping.cs new file mode 100644 index 00000000000..2194ff2b6c7 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/HeadMapping.cs @@ -0,0 +1,24 @@ +using NHibernate.Mapping.ByCode; +using NHibernate.Mapping.ByCode.Conformist; + +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + public class HeadMapping : ComponentMapping + { + public HeadMapping() + { + Class(); + Property(x => x.Title, m => + { + m.Column("PageTitle"); + m.Lazy(true); + }); + Property(x => x.DummyFieldToLoadEmptyComponent, m => + { + m.Access(Accessor.ReadOnly); + m.Formula("1"); + }); + Lazy(true); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3164/IHead.cs b/src/NHibernate.Test/NHSpecificTest/GH3164/IHead.cs new file mode 100644 index 00000000000..336366707cc --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3164/IHead.cs @@ -0,0 +1,10 @@ +namespace NHibernate.Test.NHSpecificTest.GH3164 +{ + + public interface IHead + { + string Title { get; set; } + + bool DummyFieldToLoadEmptyComponent { get; } + } +} diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 43f8403143b..c6ac2cb8dfb 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1673,14 +1673,11 @@ private string PropertySelectFragment(string name, string suffix, ICollection o == null)) - { - columnNames = SubclassPropertyFormulaTemplateClosure[index]; - } + var formulas = SubclassPropertyFormulaTemplateClosure[index]; - foreach (var columnName in columnNames) + for (var i = 0; i < columnNames.Length; i++) { + var columnName = columnNames[i] ?? formulas[i]; fetchColumnsAndFormulas.Add(columnName); } }