From f9d1b20032108e2d5415045044c90d4a9c057e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Mon, 10 Aug 2020 10:07:53 +0200 Subject: [PATCH 1/7] Added failing test case TestFetchAllPropertiesAfterEntityIsInitialized to FetchLazyPropertiesFixture. --- .../FetchLazyPropertiesFixture.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs index 49a75c4b107..8e01d600671 100644 --- a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -934,6 +934,26 @@ public void TestFetchAfterEntityIsInitialized(bool readOnly) Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True); } + [TestCase(true)] + [TestCase(false)] + public void TestFetchAllPropertiesAfterEntityIsInitialized(bool readOnly) + { + Person person; + using(var s = OpenSession()) + using(var tx = s.BeginTransaction()) + { + person = s.CreateQuery("from Person where Id = 1").SetReadOnly(readOnly).UniqueResult(); + var image = person.Image; + person = s.CreateQuery("from Person fetch all properties where Id = 1").SetReadOnly(readOnly).UniqueResult(); + + tx.Commit(); + } + + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.True); + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.True); + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True); + } + [Test] public void TestHqlCrossJoinFetchFormula() { From 5e42acd4b24352cf2134fe76b48874bdd86fb627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Mon, 10 Aug 2020 13:35:33 +0200 Subject: [PATCH 2/7] Fixed fetching all lazy properties when entity is alreday loaded --- .../Entity/AbstractEntityPersister.cs | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 924da726cc1..b56f7abf01d 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1409,24 +1409,18 @@ public void InitializeLazyProperties( throw new HibernateException($"Entity is not associated with the session: {id}"); } - int[] indexes; - int[] lazyIndexes; - if (allLazyProperties) + + var lazyProperties = allLazyProperties ? LazyProperties.ToArray() : uninitializedLazyProperties; + var metadata = InstrumentationMetadata.LazyPropertiesMetadata; + var indexes = new int[lazyProperties.Length]; + var lazyIndexes = new int[lazyProperties.Length]; + for (var i = 0; i < lazyProperties.Length; i++) { - lazyIndexes = indexes = lazyPropertyNumbers; - } - else - { - var metadata = InstrumentationMetadata.LazyPropertiesMetadata; - indexes = new int[uninitializedLazyProperties.Length]; - lazyIndexes = new int[uninitializedLazyProperties.Length]; - for (var i = 0; i < uninitializedLazyProperties.Length; i++) - { - var descriptor = metadata.GetLazyPropertyDescriptor(uninitializedLazyProperties[i]); - indexes[i] = descriptor.PropertyIndex; - lazyIndexes[i] = descriptor.LazyIndex; - } + var descriptor = metadata.GetLazyPropertyDescriptor(lazyProperties[i]); + indexes[i] = descriptor.PropertyIndex; + lazyIndexes[i] = descriptor.LazyIndex; } + var values = Hydrate(rs, id, entity, suffixedPropertyColumns, null, true, indexes, session); for (var i = 0; i < lazyIndexes.Length; i++) From 834a3daaecb1b2b821145188da86941d11be062d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Mon, 10 Aug 2020 23:22:16 +0200 Subject: [PATCH 3/7] Removed extra blank lines --- src/NHibernate/Persister/Entity/AbstractEntityPersister.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index b56f7abf01d..8c99a4827c7 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1408,7 +1408,6 @@ public void InitializeLazyProperties( { throw new HibernateException($"Entity is not associated with the session: {id}"); } - var lazyProperties = allLazyProperties ? LazyProperties.ToArray() : uninitializedLazyProperties; var metadata = InstrumentationMetadata.LazyPropertiesMetadata; @@ -1420,7 +1419,6 @@ public void InitializeLazyProperties( indexes[i] = descriptor.PropertyIndex; lazyIndexes[i] = descriptor.LazyIndex; } - var values = Hydrate(rs, id, entity, suffixedPropertyColumns, null, true, indexes, session); for (var i = 0; i < lazyIndexes.Length; i++) From f7b558bece168f4aa7628583e80b0a5d4705a0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Tue, 11 Aug 2020 16:14:32 +0200 Subject: [PATCH 4/7] Simplifed fix for fetching all lazy properties --- .../FetchLazyPropertiesFixture.cs | 20 +++++++++++ .../Entity/AbstractEntityPersister.cs | 33 +++++++++++++------ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs index 8fe1e68ba81..67b5558ad1f 100644 --- a/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -945,6 +945,26 @@ public async Task TestFetchAfterEntityIsInitializedAsync(bool readOnly) Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True); } + [TestCase(true)] + [TestCase(false)] + public async Task TestFetchAllPropertiesAfterEntityIsInitializedAsync(bool readOnly) + { + Person person; + using(var s = OpenSession()) + using(var tx = s.BeginTransaction()) + { + person = await (s.CreateQuery("from Person where Id = 1").SetReadOnly(readOnly).UniqueResultAsync()); + var image = person.Image; + person = await (s.CreateQuery("from Person fetch all properties where Id = 1").SetReadOnly(readOnly).UniqueResultAsync()); + + await (tx.CommitAsync()); + } + + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.True); + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.True); + Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True); + } + [Test] public async Task TestHqlCrossJoinFetchFormulaAsync() { diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 8c99a4827c7..ff0d0ffdbf0 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1408,18 +1408,31 @@ public void InitializeLazyProperties( { throw new HibernateException($"Entity is not associated with the session: {id}"); } - - var lazyProperties = allLazyProperties ? LazyProperties.ToArray() : uninitializedLazyProperties; - var metadata = InstrumentationMetadata.LazyPropertiesMetadata; - var indexes = new int[lazyProperties.Length]; - var lazyIndexes = new int[lazyProperties.Length]; - for (var i = 0; i < lazyProperties.Length; i++) + + int[] indexes; + int[] lazyIndexes; + if (allLazyProperties) { - var descriptor = metadata.GetLazyPropertyDescriptor(lazyProperties[i]); - indexes[i] = descriptor.PropertyIndex; - lazyIndexes[i] = descriptor.LazyIndex; + indexes = lazyPropertyNumbers; + lazyIndexes = new int[lazyPropertyNumbers.Length]; + for(var i = 0; i < lazyIndexes.Length; i++) + { + lazyIndexes[i] = i; + } } - + else + { + var metadata = InstrumentationMetadata.LazyPropertiesMetadata; + indexes = new int[uninitializedLazyProperties.Length]; + lazyIndexes = new int[uninitializedLazyProperties.Length]; + for(var i = 0; i < uninitializedLazyProperties.Length; i++) + { + var descriptor = metadata.GetLazyPropertyDescriptor(uninitializedLazyProperties[i]); + indexes[i] = descriptor.PropertyIndex; + lazyIndexes[i] = descriptor.LazyIndex; + } + } + var values = Hydrate(rs, id, entity, suffixedPropertyColumns, null, true, indexes, session); for (var i = 0; i < lazyIndexes.Length; i++) { From c1607efbc6a178909890b6862ee4b0e02289f8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Tue, 11 Aug 2020 16:45:54 +0200 Subject: [PATCH 5/7] Fix for async AbstractEntityPersister --- .../Async/Persister/Entity/AbstractEntityPersister.cs | 7 ++++++- src/NHibernate/Persister/Entity/AbstractEntityPersister.cs | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Async/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Async/Persister/Entity/AbstractEntityPersister.cs index 1d466b213e6..09f2076dd3d 100644 --- a/src/NHibernate/Async/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Async/Persister/Entity/AbstractEntityPersister.cs @@ -87,7 +87,12 @@ async Task InternalInitializeLazyPropertiesAsync() int[] lazyIndexes; if (allLazyProperties) { - lazyIndexes = indexes = lazyPropertyNumbers; + indexes = lazyPropertyNumbers; + lazyIndexes = new int[lazyPropertyNumbers.Length]; + for(var i = 0; i < lazyIndexes.Length; i++) + { + lazyIndexes[i] = i; + } } else { diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index ff0d0ffdbf0..f826b63ca0e 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1425,7 +1425,7 @@ public void InitializeLazyProperties( var metadata = InstrumentationMetadata.LazyPropertiesMetadata; indexes = new int[uninitializedLazyProperties.Length]; lazyIndexes = new int[uninitializedLazyProperties.Length]; - for(var i = 0; i < uninitializedLazyProperties.Length; i++) + for (var i = 0; i < uninitializedLazyProperties.Length; i++) { var descriptor = metadata.GetLazyPropertyDescriptor(uninitializedLazyProperties[i]); indexes[i] = descriptor.PropertyIndex; From 5c35b6c2e0f5e2819e027e0a31033b3de5bb4338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Tue, 11 Aug 2020 17:42:18 +0200 Subject: [PATCH 6/7] Deleted empty line Co-authored-by: maca88 --- src/NHibernate/Persister/Entity/AbstractEntityPersister.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index f826b63ca0e..28376ce3b11 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1432,7 +1432,6 @@ public void InitializeLazyProperties( lazyIndexes[i] = descriptor.LazyIndex; } } - var values = Hydrate(rs, id, entity, suffixedPropertyColumns, null, true, indexes, session); for (var i = 0; i < lazyIndexes.Length; i++) { From 0fda4c44aeb299680d1af0b20012030d6056278a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danko=20Durbi=C4=87?= Date: Wed, 12 Aug 2020 07:57:39 +0200 Subject: [PATCH 7/7] Added new line which was removed by mistake --- src/NHibernate/Persister/Entity/AbstractEntityPersister.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 28376ce3b11..78afb6e2b09 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -1432,6 +1432,7 @@ public void InitializeLazyProperties( lazyIndexes[i] = descriptor.LazyIndex; } } + var values = Hydrate(rs, id, entity, suffixedPropertyColumns, null, true, indexes, session); for (var i = 0; i < lazyIndexes.Length; i++) {