Skip to content

Commit 5c3033a

Browse files
bahusoidhazzik
authored andcommitted
Fix CriteriaImpl.Clone for readonly query (#1696)
1 parent 8d14aad commit 5c3033a

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

src/NHibernate.Test/Async/ReadOnly/ReadOnlyCriteriaQueryTest.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,55 @@ public async Task ModifiableSessionReadOnlyCriteriaAsync()
186186
}
187187
}
188188

189+
[Test]
190+
public async Task ModifiableSessionReadOnlyClonedCriteriaAsync()
191+
{
192+
await (DefaultTestSetupAsync());
193+
194+
using (ISession s = OpenSession())
195+
using (ITransaction t = s.BeginTransaction())
196+
{
197+
ICriteria criteria = (ICriteria) s.CreateCriteria<Student>().SetReadOnly(true).Clone();
198+
Assert.That(s.DefaultReadOnly, Is.False);
199+
Assert.That(criteria.IsReadOnlyInitialized, Is.True, "Cloned criteria must have IsReadOnlyInitialized == true");
200+
Assert.That(criteria.IsReadOnly, Is.True, "Cloned criteria must be readonly");
201+
202+
Student gavin = await (criteria.UniqueResultAsync<Student>());
203+
Assert.That(s.DefaultReadOnly, Is.False);
204+
Assert.That(criteria.IsReadOnlyInitialized, Is.True);
205+
Assert.That(criteria.IsReadOnly, Is.True);
206+
Assert.That(s.IsReadOnly(gavin), Is.True);
207+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False);
208+
await (CheckProxyReadOnlyAsync(s, gavin.PreferredCourse, true));
209+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False);
210+
211+
await (NHibernateUtil.InitializeAsync(gavin.PreferredCourse));
212+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.True);
213+
await (CheckProxyReadOnlyAsync(s, gavin.PreferredCourse, true));
214+
Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.False);
215+
216+
await (NHibernateUtil.InitializeAsync(gavin.Enrolments));
217+
Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.True);
218+
Assert.That(gavin.Enrolments.Count, Is.EqualTo(1));
219+
IEnumerator<Enrolment> enrolments = gavin.Enrolments.GetEnumerator();
220+
enrolments.MoveNext();
221+
Enrolment enrolment = enrolments.Current;
222+
Assert.That(s.IsReadOnly(enrolment), Is.False);
223+
Assert.That(NHibernateUtil.IsInitialized(enrolment.Course), Is.False);
224+
await (CheckProxyReadOnlyAsync(s, enrolment.Course, false));
225+
226+
await (NHibernateUtil.InitializeAsync(enrolment.Course));
227+
await (CheckProxyReadOnlyAsync(s, enrolment.Course, false));
228+
229+
await (s.DeleteAsync(gavin.PreferredCourse));
230+
await (s.DeleteAsync(gavin));
231+
await (s.DeleteAsync(enrolment.Course));
232+
await (s.DeleteAsync(enrolment));
233+
234+
await (t.CommitAsync());
235+
}
236+
}
237+
189238
[Test]
190239
public async Task ModifiableSessionModifiableCriteriaAsync()
191240
{

src/NHibernate.Test/ReadOnly/ReadOnlyCriteriaQueryTest.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,55 @@ public void ModifiableSessionReadOnlyCriteria()
174174
}
175175
}
176176

177+
[Test]
178+
public void ModifiableSessionReadOnlyClonedCriteria()
179+
{
180+
DefaultTestSetup();
181+
182+
using (ISession s = OpenSession())
183+
using (ITransaction t = s.BeginTransaction())
184+
{
185+
ICriteria criteria = (ICriteria) s.CreateCriteria<Student>().SetReadOnly(true).Clone();
186+
Assert.That(s.DefaultReadOnly, Is.False);
187+
Assert.That(criteria.IsReadOnlyInitialized, Is.True, "Cloned criteria must have IsReadOnlyInitialized == true");
188+
Assert.That(criteria.IsReadOnly, Is.True, "Cloned criteria must be readonly");
189+
190+
Student gavin = criteria.UniqueResult<Student>();
191+
Assert.That(s.DefaultReadOnly, Is.False);
192+
Assert.That(criteria.IsReadOnlyInitialized, Is.True);
193+
Assert.That(criteria.IsReadOnly, Is.True);
194+
Assert.That(s.IsReadOnly(gavin), Is.True);
195+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False);
196+
CheckProxyReadOnly(s, gavin.PreferredCourse, true);
197+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.False);
198+
199+
NHibernateUtil.Initialize(gavin.PreferredCourse);
200+
Assert.That(NHibernateUtil.IsInitialized(gavin.PreferredCourse), Is.True);
201+
CheckProxyReadOnly(s, gavin.PreferredCourse, true);
202+
Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.False);
203+
204+
NHibernateUtil.Initialize(gavin.Enrolments);
205+
Assert.That(NHibernateUtil.IsInitialized(gavin.Enrolments), Is.True);
206+
Assert.That(gavin.Enrolments.Count, Is.EqualTo(1));
207+
IEnumerator<Enrolment> enrolments = gavin.Enrolments.GetEnumerator();
208+
enrolments.MoveNext();
209+
Enrolment enrolment = enrolments.Current;
210+
Assert.That(s.IsReadOnly(enrolment), Is.False);
211+
Assert.That(NHibernateUtil.IsInitialized(enrolment.Course), Is.False);
212+
CheckProxyReadOnly(s, enrolment.Course, false);
213+
214+
NHibernateUtil.Initialize(enrolment.Course);
215+
CheckProxyReadOnly(s, enrolment.Course, false);
216+
217+
s.Delete(gavin.PreferredCourse);
218+
s.Delete(gavin);
219+
s.Delete(enrolment.Course);
220+
s.Delete(enrolment);
221+
222+
t.Commit();
223+
}
224+
}
225+
177226
[Test]
178227
public void ModifiableSessionModifiableCriteria()
179228
{

src/NHibernate/Impl/CriteriaImpl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,7 @@ public object Clone()
541541
CloneProjectCrtieria(clone);
542542
clone.SetResultTransformer(resultTransformer);
543543
clone.comment = comment;
544+
clone.readOnly = readOnly;
544545
if (flushMode.HasValue)
545546
{
546547
clone.SetFlushMode(flushMode.Value);

0 commit comments

Comments
 (0)