Skip to content

Commit 80ecd2e

Browse files
authored
Fetch all lazy properties when entity is already loaded fails (#2474)
1 parent ed36de0 commit 80ecd2e

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

src/NHibernate.Test/Async/FetchLazyProperties/FetchLazyPropertiesFixture.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,26 @@ public async Task TestFetchAfterEntityIsInitializedAsync(bool readOnly)
945945
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
946946
}
947947

948+
[TestCase(true)]
949+
[TestCase(false)]
950+
public async Task TestFetchAllPropertiesAfterEntityIsInitializedAsync(bool readOnly)
951+
{
952+
Person person;
953+
using(var s = OpenSession())
954+
using(var tx = s.BeginTransaction())
955+
{
956+
person = await (s.CreateQuery("from Person where Id = 1").SetReadOnly(readOnly).UniqueResultAsync<Person>());
957+
var image = person.Image;
958+
person = await (s.CreateQuery("from Person fetch all properties where Id = 1").SetReadOnly(readOnly).UniqueResultAsync<Person>());
959+
960+
await (tx.CommitAsync());
961+
}
962+
963+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.True);
964+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.True);
965+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
966+
}
967+
948968
[Test]
949969
public async Task TestHqlCrossJoinFetchFormulaAsync()
950970
{

src/NHibernate.Test/FetchLazyProperties/FetchLazyPropertiesFixture.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,26 @@ public void TestFetchAfterEntityIsInitialized(bool readOnly)
934934
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
935935
}
936936

937+
[TestCase(true)]
938+
[TestCase(false)]
939+
public void TestFetchAllPropertiesAfterEntityIsInitialized(bool readOnly)
940+
{
941+
Person person;
942+
using(var s = OpenSession())
943+
using(var tx = s.BeginTransaction())
944+
{
945+
person = s.CreateQuery("from Person where Id = 1").SetReadOnly(readOnly).UniqueResult<Person>();
946+
var image = person.Image;
947+
person = s.CreateQuery("from Person fetch all properties where Id = 1").SetReadOnly(readOnly).UniqueResult<Person>();
948+
949+
tx.Commit();
950+
}
951+
952+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Image"), Is.True);
953+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Address"), Is.True);
954+
Assert.That(NHibernateUtil.IsPropertyInitialized(person, "Formula"), Is.True);
955+
}
956+
937957
[Test]
938958
public void TestHqlCrossJoinFetchFormula()
939959
{

src/NHibernate/Async/Persister/Entity/AbstractEntityPersister.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,12 @@ async Task InternalInitializeLazyPropertiesAsync()
8787
int[] lazyIndexes;
8888
if (allLazyProperties)
8989
{
90-
lazyIndexes = indexes = lazyPropertyNumbers;
90+
indexes = lazyPropertyNumbers;
91+
lazyIndexes = new int[lazyPropertyNumbers.Length];
92+
for(var i = 0; i < lazyIndexes.Length; i++)
93+
{
94+
lazyIndexes[i] = i;
95+
}
9196
}
9297
else
9398
{

src/NHibernate/Persister/Entity/AbstractEntityPersister.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1413,7 +1413,12 @@ public void InitializeLazyProperties(
14131413
int[] lazyIndexes;
14141414
if (allLazyProperties)
14151415
{
1416-
lazyIndexes = indexes = lazyPropertyNumbers;
1416+
indexes = lazyPropertyNumbers;
1417+
lazyIndexes = new int[lazyPropertyNumbers.Length];
1418+
for(var i = 0; i < lazyIndexes.Length; i++)
1419+
{
1420+
lazyIndexes[i] = i;
1421+
}
14171422
}
14181423
else
14191424
{

0 commit comments

Comments
 (0)