diff --git a/src/NHibernate.Test/Async/ReadOnly/ReadOnlyCriteriaQueryTest.cs b/src/NHibernate.Test/Async/ReadOnly/ReadOnlyCriteriaQueryTest.cs index 9e070d7cd62..2280944089c 100644 --- a/src/NHibernate.Test/Async/ReadOnly/ReadOnlyCriteriaQueryTest.cs +++ b/src/NHibernate.Test/Async/ReadOnly/ReadOnlyCriteriaQueryTest.cs @@ -186,6 +186,55 @@ public async Task ModifiableSessionReadOnlyCriteriaAsync() } } + [Test] + public async Task ModifiableSessionReadOnlyClonedCriteriaAsync() + { + await (DefaultTestSetupAsync()); + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + ICriteria criteria = (ICriteria) s.CreateCriteria().SetReadOnly(true).Clone(); + Assert.That(s.DefaultReadOnly, Is.False); + Assert.That(criteria.IsReadOnlyInitialized, Is.True, "Cloned criteria must have IsReadOnlyInitialized == true"); + Assert.That(criteria.IsReadOnly, Is.True, "Cloned criteria must be readonly"); + + Student gavin = await (criteria.UniqueResultAsync()); + Assert.That(s.DefaultReadOnly, Is.False); + Assert.That(criteria.IsReadOnlyInitialized, Is.True); + Assert.That(criteria.IsReadOnly, Is.True); + Assert.That(s.IsReadOnly(gavin), Is.True); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False); + await (CheckProxyReadOnlyAsync(s, gavin.PreferredCourse, true)); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False); + + await (NHibernateUtil.InitializeAsync(gavin.PreferredCourse)); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.True); + await (CheckProxyReadOnlyAsync(s, gavin.PreferredCourse, true)); + Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.False); + + await (NHibernateUtil.InitializeAsync(gavin.Enrolments)); + Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.True); + Assert.That(gavin.Enrolments.Count, Is.EqualTo(1)); + IEnumerator enrolments = gavin.Enrolments.GetEnumerator(); + enrolments.MoveNext(); + Enrolment enrolment = enrolments.Current; + Assert.That(s.IsReadOnly(enrolment), Is.False); + Assert.That(NHibernateUtil.IsInitialized(enrolment.Course), Is.False); + await (CheckProxyReadOnlyAsync(s, enrolment.Course, false)); + + await (NHibernateUtil.InitializeAsync(enrolment.Course)); + await (CheckProxyReadOnlyAsync(s, enrolment.Course, false)); + + await (s.DeleteAsync(gavin.PreferredCourse)); + await (s.DeleteAsync(gavin)); + await (s.DeleteAsync(enrolment.Course)); + await (s.DeleteAsync(enrolment)); + + await (t.CommitAsync()); + } + } + [Test] public async Task ModifiableSessionModifiableCriteriaAsync() { diff --git a/src/NHibernate.Test/ReadOnly/ReadOnlyCriteriaQueryTest.cs b/src/NHibernate.Test/ReadOnly/ReadOnlyCriteriaQueryTest.cs index 8db55a3bdd4..e7a1db70d83 100644 --- a/src/NHibernate.Test/ReadOnly/ReadOnlyCriteriaQueryTest.cs +++ b/src/NHibernate.Test/ReadOnly/ReadOnlyCriteriaQueryTest.cs @@ -174,6 +174,55 @@ public void ModifiableSessionReadOnlyCriteria() } } + [Test] + public void ModifiableSessionReadOnlyClonedCriteria() + { + DefaultTestSetup(); + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + ICriteria criteria = (ICriteria) s.CreateCriteria().SetReadOnly(true).Clone(); + Assert.That(s.DefaultReadOnly, Is.False); + Assert.That(criteria.IsReadOnlyInitialized, Is.True, "Cloned criteria must have IsReadOnlyInitialized == true"); + Assert.That(criteria.IsReadOnly, Is.True, "Cloned criteria must be readonly"); + + Student gavin = criteria.UniqueResult(); + Assert.That(s.DefaultReadOnly, Is.False); + Assert.That(criteria.IsReadOnlyInitialized, Is.True); + Assert.That(criteria.IsReadOnly, Is.True); + Assert.That(s.IsReadOnly(gavin), Is.True); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False); + CheckProxyReadOnly(s, gavin.PreferredCourse, true); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False); + + NHibernateUtil.Initialize(gavin.PreferredCourse); + Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.True); + CheckProxyReadOnly(s, gavin.PreferredCourse, true); + Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.False); + + NHibernateUtil.Initialize(gavin.Enrolments); + Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.True); + Assert.That(gavin.Enrolments.Count, Is.EqualTo(1)); + IEnumerator enrolments = gavin.Enrolments.GetEnumerator(); + enrolments.MoveNext(); + Enrolment enrolment = enrolments.Current; + Assert.That(s.IsReadOnly(enrolment), Is.False); + Assert.That(NHibernateUtil.IsInitialized(enrolment.Course), Is.False); + CheckProxyReadOnly(s, enrolment.Course, false); + + NHibernateUtil.Initialize(enrolment.Course); + CheckProxyReadOnly(s, enrolment.Course, false); + + s.Delete(gavin.PreferredCourse); + s.Delete(gavin); + s.Delete(enrolment.Course); + s.Delete(enrolment); + + t.Commit(); + } + } + [Test] public void ModifiableSessionModifiableCriteria() { diff --git a/src/NHibernate/Impl/CriteriaImpl.cs b/src/NHibernate/Impl/CriteriaImpl.cs index 3a32603bb2b..89d1c0de491 100644 --- a/src/NHibernate/Impl/CriteriaImpl.cs +++ b/src/NHibernate/Impl/CriteriaImpl.cs @@ -541,6 +541,7 @@ public object Clone() CloneProjectCrtieria(clone); clone.SetResultTransformer(resultTransformer); clone.comment = comment; + clone.readOnly = readOnly; if (flushMode.HasValue) { clone.SetFlushMode(flushMode.Value);