Skip to content

Commit 9e1f930

Browse files
committed
Apply fix
1 parent 8d7a6e6 commit 9e1f930

File tree

8 files changed

+182
-11
lines changed

8 files changed

+182
-11
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NHibernate.Cfg.MappingSchema;
13+
using NHibernate.Linq;
14+
using NHibernate.Mapping.ByCode;
15+
using NUnit.Framework;
16+
17+
namespace NHibernate.Test.NHSpecificTest.GH2559
18+
{
19+
using System.Threading.Tasks;
20+
[TestFixture]
21+
public class ByCodeFixtureAsync : TestCaseMappingByCode
22+
{
23+
protected override HbmMapping GetMappings()
24+
{
25+
var mapper = new ModelMapper();
26+
mapper.Class<Person>(rc =>
27+
{
28+
rc.Id(x => x.Id, m => m.Generator(Generators.Guid));
29+
rc.Property(x => x.Name);
30+
rc.Property(x => x.Age);
31+
rc.Set(
32+
x => x.Children,
33+
colMap =>
34+
{
35+
colMap.Inverse(true);
36+
colMap.Cascade(Mapping.ByCode.Cascade.DeleteOrphans);
37+
colMap.Cache(c => c.Usage(CacheUsage.ReadWrite));
38+
},
39+
rel => rel.OneToMany());
40+
rc.Set(
41+
x => x.Cars,
42+
colMap =>
43+
{
44+
colMap.Inverse(true);
45+
colMap.Cascade(Mapping.ByCode.Cascade.DeleteOrphans);
46+
colMap.Cache(c => c.Usage(CacheUsage.ReadWrite));
47+
},
48+
rel => rel.OneToMany());
49+
rc.Cache(c => c.Usage(CacheUsage.ReadWrite));
50+
});
51+
mapper.Class<Child>(ch =>
52+
{
53+
ch.Id(x => x.Id, m => m.Generator(Generators.Guid));
54+
ch.Property(x => x.Name);
55+
ch.ManyToOne(c => c.Parent);
56+
57+
ch.Set(
58+
x => x.Pets,
59+
colMap =>
60+
{
61+
colMap.Inverse(true);
62+
colMap.Cascade(Mapping.ByCode.Cascade.DeleteOrphans);
63+
colMap.Cache(c => c.Usage(CacheUsage.ReadWrite));
64+
},
65+
rel => rel.OneToMany());
66+
67+
ch.Cache(c => c.Usage(CacheUsage.ReadWrite));
68+
});
69+
mapper.Class<Pet>(ch =>
70+
{
71+
ch.Id(x => x.Id, m => m.Generator(Generators.Guid));
72+
ch.Property(x => x.Name);
73+
ch.ManyToOne(c => c.Owner);
74+
75+
ch.Cache(c => c.Usage(CacheUsage.ReadWrite));
76+
});
77+
mapper.Class<Car>(ch =>
78+
{
79+
ch.Id(x => x.Id, m => m.Generator(Generators.Guid));
80+
ch.Property(x => x.Name);
81+
ch.ManyToOne(c => c.Owner);
82+
83+
ch.Cache(c => c.Usage(CacheUsage.ReadWrite));
84+
});
85+
86+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
87+
}
88+
89+
protected override void OnSetUp()
90+
{
91+
using (var session = OpenSession())
92+
using (var transaction = session.BeginTransaction())
93+
{
94+
var person = new Person { Name = "Person 1", Age = 18 };
95+
96+
var car1 = new Car { Name = "Car1", Owner = person };
97+
var car2 = new Car { Name = "Car2", Owner = person };
98+
session.Save(car1);
99+
session.Save(car2);
100+
101+
session.Save(person);
102+
transaction.Commit();
103+
}
104+
}
105+
106+
protected override void OnTearDown()
107+
{
108+
using (var session = OpenSession())
109+
using (var transaction = session.BeginTransaction())
110+
{
111+
session.CreateQuery("delete from Pet").ExecuteUpdate();
112+
session.CreateQuery("delete from Child").ExecuteUpdate();
113+
session.CreateQuery("delete from Car").ExecuteUpdate();
114+
session.CreateQuery("delete from Person").ExecuteUpdate();
115+
transaction.Commit();
116+
}
117+
}
118+
119+
[Test]
120+
public async Task TestQueryCachingWithThenFetchManyAsync()
121+
{
122+
Person dbPerson;
123+
Person cachePerson;
124+
using (var session = OpenSession())
125+
using (var transaction = session.BeginTransaction())
126+
{
127+
var query =
128+
session
129+
.Query<Person>()
130+
.FetchMany(p => p.Children)
131+
.ThenFetchMany(ch => ch.Pets)
132+
.FetchMany(p => p.Cars) as IQueryable<Person>
133+
;
134+
135+
query = query.WithOptions(opt =>
136+
opt.SetCacheable(true)
137+
.SetCacheMode(CacheMode.Normal)
138+
.SetCacheRegion("Long_Cache"));
139+
140+
dbPerson = (await (query.ToListAsync())).First(); // First time the result will be cached
141+
cachePerson = (await (query.ToListAsync())).First();
142+
143+
await (transaction.CommitAsync());
144+
}
145+
146+
Assert.That(NHibernateUtil.IsInitialized(dbPerson.Cars), Is.True);
147+
Assert.That(NHibernateUtil.IsInitialized(cachePerson.Cars), Is.True);
148+
Assert.That(dbPerson.Cars, Has.Count.EqualTo(2));
149+
Assert.That(cachePerson.Cars, Has.Count.EqualTo(2));
150+
151+
Assert.That(NHibernateUtil.IsInitialized(dbPerson.Children), Is.True);
152+
Assert.That(NHibernateUtil.IsInitialized(cachePerson.Children), Is.True);
153+
Assert.That(dbPerson.Children, Has.Count.EqualTo(0));
154+
Assert.That(cachePerson.Children, Has.Count.EqualTo(0));
155+
}
156+
}
157+
}

src/NHibernate.Test/NHSpecificTest/CachingComplexQuery/Car.cs renamed to src/NHibernate.Test/NHSpecificTest/GH2559/Car.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
namespace NHibernate.Test.NHSpecificTest.CachingComplexQuery
3+
namespace NHibernate.Test.NHSpecificTest.GH2559
44
{
55
public class Car
66
{

src/NHibernate.Test/NHSpecificTest/CachingComplexQuery/Child.cs renamed to src/NHibernate.Test/NHSpecificTest/GH2559/Child.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33

4-
namespace NHibernate.Test.NHSpecificTest.CachingComplexQuery
4+
namespace NHibernate.Test.NHSpecificTest.GH2559
55
{
66
public class Child
77
{

src/NHibernate.Test/NHSpecificTest/CachingComplexQuery/FixtureByCode.cs renamed to src/NHibernate.Test/NHSpecificTest/GH2559/FixtureByCode.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System.Linq;
22
using NHibernate.Cfg.MappingSchema;
3-
using NHibernate.Mapping.ByCode;
43
using NHibernate.Linq;
4+
using NHibernate.Mapping.ByCode;
55
using NUnit.Framework;
66

7-
namespace NHibernate.Test.NHSpecificTest.CachingComplexQuery
7+
namespace NHibernate.Test.NHSpecificTest.GH2559
88
{
99
[TestFixture]
1010
public class ByCodeFixture : TestCaseMappingByCode
@@ -108,6 +108,8 @@ protected override void OnTearDown()
108108
[Test]
109109
public void TestQueryCachingWithThenFetchMany()
110110
{
111+
Person dbPerson;
112+
Person cachePerson;
111113
using (var session = OpenSession())
112114
using (var transaction = session.BeginTransaction())
113115
{
@@ -116,17 +118,29 @@ public void TestQueryCachingWithThenFetchMany()
116118
.Query<Person>()
117119
.FetchMany(p => p.Children)
118120
.ThenFetchMany(ch => ch.Pets)
119-
.FetchMany(p => p.Cars) as IQueryable<Person>;
121+
.FetchMany(p => p.Cars) as IQueryable<Person>
122+
;
120123

121124
query = query.WithOptions(opt =>
122125
opt.SetCacheable(true)
123126
.SetCacheMode(CacheMode.Normal)
124127
.SetCacheRegion("Long_Cache"));
125128

126-
query.ToList(); // First time the result will be cached
127-
Assert.That(() => query.ToList(), Throws.Nothing);
129+
dbPerson = query.ToList().First(); // First time the result will be cached
130+
cachePerson = query.ToList().First();
131+
128132
transaction.Commit();
129133
}
134+
135+
Assert.That(NHibernateUtil.IsInitialized(dbPerson.Cars), Is.True);
136+
Assert.That(NHibernateUtil.IsInitialized(cachePerson.Cars), Is.True);
137+
Assert.That(dbPerson.Cars, Has.Count.EqualTo(2));
138+
Assert.That(cachePerson.Cars, Has.Count.EqualTo(2));
139+
140+
Assert.That(NHibernateUtil.IsInitialized(dbPerson.Children), Is.True);
141+
Assert.That(NHibernateUtil.IsInitialized(cachePerson.Children), Is.True);
142+
Assert.That(dbPerson.Children, Has.Count.EqualTo(0));
143+
Assert.That(cachePerson.Children, Has.Count.EqualTo(0));
130144
}
131145
}
132146
}

src/NHibernate.Test/NHSpecificTest/CachingComplexQuery/Person.cs renamed to src/NHibernate.Test/NHSpecificTest/GH2559/Person.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33

4-
namespace NHibernate.Test.NHSpecificTest.CachingComplexQuery
4+
namespace NHibernate.Test.NHSpecificTest.GH2559
55
{
66
public class Person
77
{

src/NHibernate.Test/NHSpecificTest/CachingComplexQuery/Pet.cs renamed to src/NHibernate.Test/NHSpecificTest/GH2559/Pet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
namespace NHibernate.Test.NHSpecificTest.CachingComplexQuery
3+
namespace NHibernate.Test.NHSpecificTest.GH2559
44
{
55
public class Pet
66
{

src/NHibernate/Async/Type/CollectionType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public override async Task BeforeAssembleAsync(object oid, ISessionImplementor s
105105
{
106106
cancellationToken.ThrowIfCancellationRequested();
107107
var queryCacheQueue = session.PersistenceContext.BatchFetchQueue.QueryCacheQueue;
108-
if (queryCacheQueue == null)
108+
if (queryCacheQueue == null || oid == null)
109109
{
110110
return;
111111
}

src/NHibernate/Type/CollectionType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public override object Disassemble(object value, ISessionImplementor session, ob
161161
public override void BeforeAssemble(object oid, ISessionImplementor session)
162162
{
163163
var queryCacheQueue = session.PersistenceContext.BatchFetchQueue.QueryCacheQueue;
164-
if (queryCacheQueue == null)
164+
if (queryCacheQueue == null || oid == null)
165165
{
166166
return;
167167
}

0 commit comments

Comments
 (0)