diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3424/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3424/Fixture.cs new file mode 100644 index 00000000000..ef60ff14aac --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3424/Fixture.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// +// 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.Collections.Generic; +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3424 +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + + var c1 = new Child { Name = "Rob" }; + session.Save(c1); + var e1 = new Entity { Name = "Bob", Children = new HashSet { c1 } }; + session.Save(e1); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete Child").ExecuteUpdate(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public async Task QueryingAfterFutureThenClearAsync() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var futureBob = session.Query().Where(e => e.Name == "Bob").ToFutureValue(q => q.FirstOrDefault()); + var bob = await (futureBob.GetValueAsync()); + Assert.That(bob, Is.Not.Null); + session.Clear(); + + var allQuery = session.Query(); + Assert.That(() => allQuery.ToListAsync(), Has.Count.EqualTo(1)); + await (transaction.CommitAsync()); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3424/Entities.cs b/src/NHibernate.Test/NHSpecificTest/GH3424/Entities.cs new file mode 100644 index 00000000000..e72fe68c43c --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3424/Entities.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH3424 +{ + class Entity + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + public virtual ISet Children { get; set; } + } + + class Child + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3424/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3424/Fixture.cs new file mode 100644 index 00000000000..5c829ce5c2d --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3424/Fixture.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3424 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + + var c1 = new Child { Name = "Rob" }; + session.Save(c1); + var e1 = new Entity { Name = "Bob", Children = new HashSet { c1 } }; + session.Save(e1); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete Child").ExecuteUpdate(); + session.CreateQuery("delete from System.Object").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public void QueryingAfterFutureThenClear() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var futureBob = session.Query().Where(e => e.Name == "Bob").ToFutureValue(q => q.FirstOrDefault()); + var bob = futureBob.Value; + Assert.That(bob, Is.Not.Null); + session.Clear(); + + var allQuery = session.Query(); + Assert.That(() => allQuery.ToList(), Has.Count.EqualTo(1)); + transaction.Commit(); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3424/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3424/Mappings.hbm.xml new file mode 100644 index 00000000000..e692e287c11 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3424/Mappings.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate/Engine/StatefulPersistenceContext.cs b/src/NHibernate/Engine/StatefulPersistenceContext.cs index 7819a59989b..f912c9b8bdc 100644 --- a/src/NHibernate/Engine/StatefulPersistenceContext.cs +++ b/src/NHibernate/Engine/StatefulPersistenceContext.cs @@ -264,6 +264,7 @@ public void Clear() entityEntries.Clear(); entitySnapshotsByKey.Clear(); collectionsByKey.Clear(); + nonlazyCollections.Clear(); collectionEntries.Clear(); if (unownedCollections != null) {