Skip to content

Commit 2cd54e6

Browse files
authored
Fix fetching properties from unmapped base class (#3357)
Fixes #3352
1 parent b8d9abd commit 2cd54e6

File tree

4 files changed

+378
-6
lines changed

4 files changed

+378
-6
lines changed
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
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.GH3352
18+
{
19+
using System.Threading.Tasks;
20+
[TestFixture]
21+
public class FetchFromNotMappedBaseClassFixtureAsync : TestCaseMappingByCode
22+
{
23+
protected override HbmMapping GetMappings()
24+
{
25+
var mapper = new ModelMapper();
26+
mapper.Class<EntityNameMapped>(rc =>
27+
{
28+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
29+
rc.Property(x => x.Name, m => m.Lazy(true));
30+
});
31+
mapper.Class<EntityParentMapped>(rc =>
32+
{
33+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
34+
rc.ManyToOne(x => x.Parent, m => m.ForeignKey("none"));
35+
});
36+
mapper.Class<EntityComponentMapped>(rc =>
37+
{
38+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
39+
rc.Component(x => x.Component);
40+
});
41+
mapper.Component<Component>(rc =>
42+
{
43+
rc.Property(x => x.Field);
44+
rc.ManyToOne(x => x.Entity, m => m.ForeignKey("none"));
45+
rc.Lazy(true);
46+
});
47+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
48+
}
49+
50+
protected override void OnSetUp()
51+
{
52+
using var session = OpenSession();
53+
using var transaction = session.BeginTransaction();
54+
var np = new EntityComponentMapped { Component = new Component { Field = "x" } };
55+
session.Save(np);
56+
var e = new EntityParentMapped { Parent = np };
57+
session.Save(e);
58+
var nameMapped = new EntityNameMapped { Name = "lazy" };
59+
session.Save(nameMapped);
60+
np.Component.Entity = nameMapped;
61+
62+
transaction.Commit();
63+
}
64+
65+
protected override void OnTearDown()
66+
{
67+
using var session = OpenSession();
68+
using var transaction = session.BeginTransaction();
69+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
70+
71+
transaction.Commit();
72+
}
73+
74+
[Test]
75+
public async Task CanFetchLazyComponentFromNotMappedBaseClassAsync()
76+
{
77+
using var session = OpenSession();
78+
var list = await (session.Query<EntityComponentMapped>().Fetch(x => x.Component).ToListAsync());
79+
80+
Assert.That(list, Has.Count.EqualTo(1));
81+
var result = list[0];
82+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
83+
Assert.That(result.Component.Field, Is.EqualTo("x"));
84+
}
85+
86+
[Test]
87+
public async Task CanFetchLazyComponentThenEntityFromNotMappedBaseClassAsync()
88+
{
89+
using var session = OpenSession();
90+
var list = await (session.Query<EntityComponentMapped>()
91+
.Fetch(x => x.Component)
92+
.ThenFetch(x => x.Entity)
93+
.ThenFetch(x => x.Name)
94+
.ToListAsync());
95+
96+
Assert.That(list, Has.Count.EqualTo(1));
97+
var result = list[0];
98+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
99+
Assert.That(result.Component.Field, Is.EqualTo("x"));
100+
Assert.That(result.Component.Entity, Is.Not.Null);
101+
Assert.That(NHibernateUtil.IsInitialized(result.Component.Entity), Is.True);
102+
Assert.That(NHibernateUtil.IsPropertyInitialized(result.Component.Entity, nameof(result.Name)), Is.True);
103+
Assert.That(result.Component.Entity.Name, Is.EqualTo("lazy"));
104+
}
105+
106+
[Test]
107+
public async Task CanFetchLazyPropertyFromNotMappedBaseClassAsync()
108+
{
109+
using var session = OpenSession();
110+
var list = await (session.Query<EntityNameMapped>().Fetch(x => x.Name).ToListAsync());
111+
112+
Assert.That(list, Has.Count.EqualTo(1));
113+
var result = list[0];
114+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Name)));
115+
Assert.That(result.Name, Is.EqualTo("lazy"));
116+
}
117+
118+
[Test]
119+
public async Task CanThenFetchLazyComponentFromNotMappedBaseClassAsync()
120+
{
121+
using var session = OpenSession();
122+
var list = await (session.Query<EntityParentMapped>().Fetch(x => x.Parent).ThenFetch(x => x.Component).ToListAsync());
123+
124+
Assert.That(list, Has.Count.EqualTo(1));
125+
var result = list[0].Parent;
126+
Assert.That(NHibernateUtil.IsInitialized(result), Is.True);
127+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
128+
Assert.That(result.Component.Field, Is.EqualTo("x"));
129+
}
130+
131+
[KnownBug("GH-3356")]
132+
[Test(Description = "GH-3356" )]
133+
public async Task FetchAfterSelectAsync()
134+
{
135+
using var log = new SqlLogSpy();
136+
137+
using var s = OpenSession();
138+
var list = await (s.Query<EntityParentMapped>()
139+
.Select(x => x.Parent)
140+
.Fetch(x => x.Component)
141+
.ThenFetch(x => x.Entity)
142+
.ThenFetch(x => x.Name)
143+
.ToListAsync());
144+
Assert.That(list, Has.Count.EqualTo(1));
145+
var result = list[0];
146+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
147+
Assert.That(result.Component.Field, Is.EqualTo("x"));
148+
Assert.That(result.Component.Entity, Is.Not.Null);
149+
Assert.That(NHibernateUtil.IsInitialized(result.Component.Entity), Is.True);
150+
Assert.That(NHibernateUtil.IsPropertyInitialized(result.Component.Entity, nameof(result.Name)), Is.True);
151+
Assert.That(result.Component.Entity.Name, Is.EqualTo("lazy"));
152+
}
153+
154+
[Test]
155+
public async Task CanFetchEntityFromNotMappedBaseClassAsync()
156+
{
157+
using var session = OpenSession();
158+
var list = await (session.Query<EntityParentMapped>().Fetch(x => x.Parent).ToListAsync());
159+
160+
Assert.That(list, Has.Count.EqualTo(1));
161+
Assert.That(list[0].Parent, Is.Not.Null);
162+
Assert.That(NHibernateUtil.IsInitialized(list[0].Parent));
163+
}
164+
165+
[Test]
166+
public void FetchNotMappedAssociationThrowsAsync()
167+
{
168+
using var session = OpenSession();
169+
var query = session.Query<EntityNameMapped>().Fetch(x => x.Parent);
170+
171+
Assert.ThrowsAsync<QueryException>(() => query.ToListAsync());
172+
}
173+
}
174+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH3352
4+
{
5+
public class Entity
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual string Name { get; set; }
9+
public virtual EntityComponentMapped Parent { get; set; }
10+
public virtual Component Component { get; set; }
11+
}
12+
13+
public class EntityNameMapped : Entity
14+
{
15+
}
16+
17+
public class EntityParentMapped : Entity
18+
{
19+
}
20+
21+
public class EntityComponentMapped : Entity
22+
{
23+
}
24+
25+
public class Component
26+
{
27+
public string Field { get; set; }
28+
29+
public EntityNameMapped Entity { get; set; }
30+
}
31+
}
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
using System.Linq;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Linq;
4+
using NHibernate.Mapping.ByCode;
5+
using NUnit.Framework;
6+
7+
namespace NHibernate.Test.NHSpecificTest.GH3352
8+
{
9+
[TestFixture]
10+
public class FetchFromNotMappedBaseClassFixture : TestCaseMappingByCode
11+
{
12+
protected override HbmMapping GetMappings()
13+
{
14+
var mapper = new ModelMapper();
15+
mapper.Class<EntityNameMapped>(rc =>
16+
{
17+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
18+
rc.Property(x => x.Name, m => m.Lazy(true));
19+
});
20+
mapper.Class<EntityParentMapped>(rc =>
21+
{
22+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
23+
rc.ManyToOne(x => x.Parent, m => m.ForeignKey("none"));
24+
});
25+
mapper.Class<EntityComponentMapped>(rc =>
26+
{
27+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
28+
rc.Component(x => x.Component);
29+
});
30+
mapper.Component<Component>(rc =>
31+
{
32+
rc.Property(x => x.Field);
33+
rc.ManyToOne(x => x.Entity, m => m.ForeignKey("none"));
34+
rc.Lazy(true);
35+
});
36+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
37+
}
38+
39+
protected override void OnSetUp()
40+
{
41+
using var session = OpenSession();
42+
using var transaction = session.BeginTransaction();
43+
var np = new EntityComponentMapped { Component = new Component { Field = "x" } };
44+
session.Save(np);
45+
var e = new EntityParentMapped { Parent = np };
46+
session.Save(e);
47+
var nameMapped = new EntityNameMapped { Name = "lazy" };
48+
session.Save(nameMapped);
49+
np.Component.Entity = nameMapped;
50+
51+
transaction.Commit();
52+
}
53+
54+
protected override void OnTearDown()
55+
{
56+
using var session = OpenSession();
57+
using var transaction = session.BeginTransaction();
58+
session.CreateQuery("delete from System.Object").ExecuteUpdate();
59+
60+
transaction.Commit();
61+
}
62+
63+
[Test]
64+
public void CanFetchLazyComponentFromNotMappedBaseClass()
65+
{
66+
using var session = OpenSession();
67+
var list = session.Query<EntityComponentMapped>().Fetch(x => x.Component).ToList();
68+
69+
Assert.That(list, Has.Count.EqualTo(1));
70+
var result = list[0];
71+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
72+
Assert.That(result.Component.Field, Is.EqualTo("x"));
73+
}
74+
75+
[Test]
76+
public void CanFetchLazyComponentThenEntityFromNotMappedBaseClass()
77+
{
78+
using var session = OpenSession();
79+
var list = session.Query<EntityComponentMapped>()
80+
.Fetch(x => x.Component)
81+
.ThenFetch(x => x.Entity)
82+
.ThenFetch(x => x.Name)
83+
.ToList();
84+
85+
Assert.That(list, Has.Count.EqualTo(1));
86+
var result = list[0];
87+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
88+
Assert.That(result.Component.Field, Is.EqualTo("x"));
89+
Assert.That(result.Component.Entity, Is.Not.Null);
90+
Assert.That(NHibernateUtil.IsInitialized(result.Component.Entity), Is.True);
91+
Assert.That(NHibernateUtil.IsPropertyInitialized(result.Component.Entity, nameof(result.Name)), Is.True);
92+
Assert.That(result.Component.Entity.Name, Is.EqualTo("lazy"));
93+
}
94+
95+
[Test]
96+
public void CanFetchLazyPropertyFromNotMappedBaseClass()
97+
{
98+
using var session = OpenSession();
99+
var list = session.Query<EntityNameMapped>().Fetch(x => x.Name).ToList();
100+
101+
Assert.That(list, Has.Count.EqualTo(1));
102+
var result = list[0];
103+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Name)));
104+
Assert.That(result.Name, Is.EqualTo("lazy"));
105+
}
106+
107+
[Test]
108+
public void CanThenFetchLazyComponentFromNotMappedBaseClass()
109+
{
110+
using var session = OpenSession();
111+
var list = session.Query<EntityParentMapped>().Fetch(x => x.Parent).ThenFetch(x => x.Component).ToList();
112+
113+
Assert.That(list, Has.Count.EqualTo(1));
114+
var result = list[0].Parent;
115+
Assert.That(NHibernateUtil.IsInitialized(result), Is.True);
116+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
117+
Assert.That(result.Component.Field, Is.EqualTo("x"));
118+
}
119+
120+
[KnownBug("GH-3356")]
121+
[Test(Description = "GH-3356" )]
122+
public void FetchAfterSelect()
123+
{
124+
using var log = new SqlLogSpy();
125+
126+
using var s = OpenSession();
127+
var list = s.Query<EntityParentMapped>()
128+
.Select(x => x.Parent)
129+
.Fetch(x => x.Component)
130+
.ThenFetch(x => x.Entity)
131+
.ThenFetch(x => x.Name)
132+
.ToList();
133+
Assert.That(list, Has.Count.EqualTo(1));
134+
var result = list[0];
135+
Assert.That(NHibernateUtil.IsPropertyInitialized(result, nameof(result.Component)));
136+
Assert.That(result.Component.Field, Is.EqualTo("x"));
137+
Assert.That(result.Component.Entity, Is.Not.Null);
138+
Assert.That(NHibernateUtil.IsInitialized(result.Component.Entity), Is.True);
139+
Assert.That(NHibernateUtil.IsPropertyInitialized(result.Component.Entity, nameof(result.Name)), Is.True);
140+
Assert.That(result.Component.Entity.Name, Is.EqualTo("lazy"));
141+
}
142+
143+
[Test]
144+
public void CanFetchEntityFromNotMappedBaseClass()
145+
{
146+
using var session = OpenSession();
147+
var list = session.Query<EntityParentMapped>().Fetch(x => x.Parent).ToList();
148+
149+
Assert.That(list, Has.Count.EqualTo(1));
150+
Assert.That(list[0].Parent, Is.Not.Null);
151+
Assert.That(NHibernateUtil.IsInitialized(list[0].Parent));
152+
}
153+
154+
[Test]
155+
public void FetchNotMappedAssociationThrows()
156+
{
157+
using var session = OpenSession();
158+
var query = session.Query<EntityNameMapped>().Fetch(x => x.Parent);
159+
160+
Assert.Throws<QueryException>(() => query.ToList());
161+
}
162+
}
163+
}

0 commit comments

Comments
 (0)