From e8f622990f8a126027981bd9a9bb61a2e512d268 Mon Sep 17 00:00:00 2001 From: Alexander Shutov Date: Tue, 20 Jun 2023 11:28:01 +0400 Subject: [PATCH 1/4] Update FetchLazyPropertiesFixture.cs Add test TestLinqFetchAllProperties_WhenLazyPropertyChanged --- .../FetchLazyPropertiesFixture.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs index f1a81fb7e61..44aafbc57c0 100644 --- a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -263,6 +263,25 @@ public void TestLinqFetchAllProperties() AssertFetchAllProperties(person); } + [Test] + public void TestLinqFetchAllProperties_WhenLazyPropertyChanged() + { + Person person; + using (var s = OpenSession()) + { + person = s.Get(1); + CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); + + person.Image = new byte[] { 1, 2, 3 }; + + var allPersons = s.Query().FetchLazyProperties().ToList(); + // After execute FetchLazyProperties(), I expected to see that the person.Image would be { 1, 2, 3 }. + // Because I changed this person.Image manually, I didn't want to lose those changes. + // But test failed. Оld value returned { 0 }. + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); // test failed + } + } + private static void AssertFetchAllProperties(Person person) { Assert.That(person, Is.Not.Null); From d2f455b8d331425c6283b47c3f75b3da1abd4076 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Thu, 29 Jun 2023 12:49:54 +0300 Subject: [PATCH 2/4] More tests --- .../FetchLazyPropertiesFixture.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs index 44aafbc57c0..9c3f00a4bcd 100644 --- a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -263,14 +263,16 @@ public void TestLinqFetchAllProperties() AssertFetchAllProperties(person); } - [Test] - public void TestLinqFetchAllProperties_WhenLazyPropertyChanged() + [TestCase(true)] + [TestCase(false)] + public void TestLinqFetchAllProperties_WhenLazyPropertyChanged(bool initLazyPropertyFetchGroup) { Person person; using (var s = OpenSession()) { person = s.Get(1); - CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); + if (initLazyPropertyFetchGroup) + CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); person.Image = new byte[] { 1, 2, 3 }; @@ -278,7 +280,25 @@ public void TestLinqFetchAllProperties_WhenLazyPropertyChanged() // After execute FetchLazyProperties(), I expected to see that the person.Image would be { 1, 2, 3 }. // Because I changed this person.Image manually, I didn't want to lose those changes. // But test failed. Оld value returned { 0 }. - CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); // test failed + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); + } + } + + [TestCase(true)] + [TestCase(false)] + public void TestLinqFetchProperty_WhenLazyPropertyChanged(bool initLazyPropertyFetchGroup) + { + Person person; + using (var s = OpenSession()) + { + person = s.Get(1); + if (initLazyPropertyFetchGroup) + CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); + + person.Image = new byte[] { 1, 2, 3 }; + + var allPersons = s.Query().Fetch(x => x.Image).ToList(); + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); } } From 53936c1cc92590317089c9845b60ff46c19979ac Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 21 Jun 2023 13:26:28 +0300 Subject: [PATCH 3/4] fix --- src/NHibernate/Loader/Loader.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/NHibernate/Loader/Loader.cs b/src/NHibernate/Loader/Loader.cs index ba56146dbbd..473cd620635 100644 --- a/src/NHibernate/Loader/Loader.cs +++ b/src/NHibernate/Loader/Loader.cs @@ -1203,8 +1203,13 @@ private void UpdateLazyPropertiesFromResultSet(DbDataReader rs, int i, object ob ? persister.EntityMetamodel.BytecodeEnhancementMetadata.GetUninitializedLazyProperties(entry.LoadedState) : persister.EntityMetamodel.BytecodeEnhancementMetadata.GetUninitializedLazyProperties(obj); - var updateLazyProperties = fetchLazyProperties?.Intersect(uninitializedProperties).ToArray(); - if (updateLazyProperties?.Length == 0) + if (uninitializedProperties.Count == 0) + return; + + var updateLazyProperties = fetchAllProperties + ? uninitializedProperties.ToArray() + : fetchLazyProperties.Intersect(uninitializedProperties).ToArray(); + if (updateLazyProperties.Length == 0) { return; // No new lazy properites were loaded } @@ -1220,7 +1225,7 @@ private void UpdateLazyPropertiesFromResultSet(DbDataReader rs, int i, object ob ? EntityAliases[i].SuffixedPropertyAliases : GetSubclassEntityAliases(i, persister); - if (!persister.InitializeLazyProperties(rs, id, obj, cols, updateLazyProperties, fetchAllProperties, session)) + if (!persister.InitializeLazyProperties(rs, id, obj, cols, updateLazyProperties, false, session)) { return; } From 2a72a94d8989dc307ac5c0b40f4eff7e8c66ffc2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 29 Jun 2023 10:03:32 +0000 Subject: [PATCH 4/4] Generate async files --- .../FetchLazyPropertiesFixture.cs | 39 +++++++++++++++++++ src/NHibernate/Async/Loader/Loader.cs | 11 ++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs index e95e9c6fb3b..50a24601b86 100644 --- a/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -274,6 +274,45 @@ public async Task TestLinqFetchAllPropertiesAsync() AssertFetchAllProperties(person); } + [TestCase(true)] + [TestCase(false)] + public async Task TestLinqFetchAllProperties_WhenLazyPropertyChangedAsync(bool initLazyPropertyFetchGroup) + { + Person person; + using (var s = OpenSession()) + { + person = await (s.GetAsync(1)); + if (initLazyPropertyFetchGroup) + CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); + + person.Image = new byte[] { 1, 2, 3 }; + + var allPersons = await (s.Query().FetchLazyProperties().ToListAsync()); + // After execute FetchLazyProperties(), I expected to see that the person.Image would be { 1, 2, 3 }. + // Because I changed this person.Image manually, I didn't want to lose those changes. + // But test failed. Оld value returned { 0 }. + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); + } + } + + [TestCase(true)] + [TestCase(false)] + public async Task TestLinqFetchProperty_WhenLazyPropertyChangedAsync(bool initLazyPropertyFetchGroup) + { + Person person; + using (var s = OpenSession()) + { + person = await (s.GetAsync(1)); + if (initLazyPropertyFetchGroup) + CollectionAssert.AreEqual(new byte[] { 0 }, person.Image); + + person.Image = new byte[] { 1, 2, 3 }; + + var allPersons = await (s.Query().Fetch(x => x.Image).ToListAsync()); + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, person.Image); + } + } + private static void AssertFetchAllProperties(Person person) { Assert.That(person, Is.Not.Null); diff --git a/src/NHibernate/Async/Loader/Loader.cs b/src/NHibernate/Async/Loader/Loader.cs index a8a235d48c3..7ee01139d3a 100644 --- a/src/NHibernate/Async/Loader/Loader.cs +++ b/src/NHibernate/Async/Loader/Loader.cs @@ -797,8 +797,13 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i ? persister.EntityMetamodel.BytecodeEnhancementMetadata.GetUninitializedLazyProperties(entry.LoadedState) : persister.EntityMetamodel.BytecodeEnhancementMetadata.GetUninitializedLazyProperties(obj); - var updateLazyProperties = fetchLazyProperties?.Intersect(uninitializedProperties).ToArray(); - if (updateLazyProperties?.Length == 0) + if (uninitializedProperties.Count == 0) + return; + + var updateLazyProperties = fetchAllProperties + ? uninitializedProperties.ToArray() + : fetchLazyProperties.Intersect(uninitializedProperties).ToArray(); + if (updateLazyProperties.Length == 0) { return; // No new lazy properites were loaded } @@ -814,7 +819,7 @@ private async Task UpdateLazyPropertiesFromResultSetAsync(DbDataReader rs, int i ? EntityAliases[i].SuffixedPropertyAliases : GetSubclassEntityAliases(i, persister); - if (!await (persister.InitializeLazyPropertiesAsync(rs, id, obj, cols, updateLazyProperties, fetchAllProperties, session, cancellationToken)).ConfigureAwait(false)) + if (!await (persister.InitializeLazyPropertiesAsync(rs, id, obj, cols, updateLazyProperties, false, session, cancellationToken)).ConfigureAwait(false)) { return; }