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.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs index f1a81fb7e61..9c3f00a4bcd 100644 --- a/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs +++ b/src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs @@ -263,6 +263,45 @@ public void TestLinqFetchAllProperties() AssertFetchAllProperties(person); } + [TestCase(true)] + [TestCase(false)] + public void TestLinqFetchAllProperties_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().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); + } + } + + [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); + } + } + 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; } 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; }