Skip to content

Commit 660dcd3

Browse files
committed
Tests for transient proxy
1 parent 7969cf3 commit 660dcd3

File tree

4 files changed

+281
-8
lines changed

4 files changed

+281
-8
lines changed

src/NHibernate.Test/Async/NHSpecificTest/GH2043/Fixture.cs

Lines changed: 131 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@
1111
using System;
1212
using System.Linq;
1313
using NHibernate.Cfg.MappingSchema;
14+
using NHibernate.Engine;
1415
using NHibernate.Mapping.ByCode;
16+
using NHibernate.Proxy;
1517
using NUnit.Framework;
1618
using NHibernate.Linq;
1719

1820
namespace NHibernate.Test.NHSpecificTest.GH2043
1921
{
2022
using System.Threading.Tasks;
23+
using System.Threading;
2124
[TestFixture]
2225
public class FixtureAsync : TestCaseMappingByCode
2326
{
@@ -61,10 +64,31 @@ protected override HbmMapping GetMappings()
6164
rc.ManyToOne(x => x.EntityLookup, x => x.Class(typeof(EntityWithInterfaceProxyDefinition)));
6265
});
6366

67+
mapper.Class<EntityAssigned>(rc =>
68+
{
69+
rc.Id(x => x.Id, m => m.Generator(Generators.Assigned));
70+
rc.Property(x => x.Name);
71+
rc.ManyToOne(x => x.Parent);
72+
});
73+
74+
mapper.Class<EntityWithAssignedBag>(
75+
rc =>
76+
{
77+
rc.Id(x => x.Id, m => m.Generator(Generators.Assigned));
78+
rc.Property(x => x.Name);
79+
rc.Bag(
80+
x => x.Children,
81+
m =>
82+
{
83+
m.Inverse(true);
84+
m.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
85+
},
86+
cm => { cm.OneToMany(); });
87+
});
88+
6489
return mapper.CompileMappingForAllExplicitlyAddedEntities();
6590
}
6691

67-
6892
protected override void OnSetUp()
6993
{
7094
using(var session = OpenSession())
@@ -125,7 +149,6 @@ protected override void OnSetUp()
125149
}
126150
}
127151

128-
129152
protected override void OnTearDown()
130153
{
131154
using (var session = OpenSession())
@@ -138,7 +161,6 @@ protected override void OnTearDown()
138161
}
139162
}
140163

141-
142164
[Test]
143165
public async Task UpdateEntityWithClassLookupAsync()
144166
{
@@ -156,7 +178,6 @@ public async Task UpdateEntityWithClassLookupAsync()
156178
}
157179
}
158180

159-
160181
[Test]
161182
public async Task UpdateEntityWithInterfaceLookupAsync()
162183
{
@@ -173,5 +194,111 @@ public async Task UpdateEntityWithInterfaceLookupAsync()
173194
await (transaction.CommitAsync());
174195
}
175196
}
197+
198+
[Test]
199+
public async Task TransientProxySaveAsync()
200+
{
201+
var id = 10;
202+
203+
using (var session = OpenSession())
204+
using(var t = session.BeginTransaction())
205+
{
206+
var e = new EntityAssigned() {Id = id, Name = "a"};
207+
208+
await (session.SaveAsync(e));
209+
await (session.FlushAsync());
210+
await (t.CommitAsync());
211+
}
212+
213+
using (var session = OpenSession())
214+
using(var t = session.BeginTransaction())
215+
{
216+
var e = await (GetTransientProxyAsync(session, id));
217+
await (session.SaveAsync(e));
218+
await (session.FlushAsync());
219+
220+
await (t.CommitAsync());
221+
}
222+
223+
using (var session = OpenSession())
224+
{
225+
var entity = await (session.GetAsync<EntityAssigned>(id));
226+
Assert.That(entity, Is.Not.Null, "Transient proxy wasn't saved");
227+
}
228+
}
229+
230+
[Test]
231+
public async Task TransientProxyBagCascadeSaveAsync()
232+
{
233+
var id = 10;
234+
235+
using (var session = OpenSession())
236+
using(var t = session.BeginTransaction())
237+
{
238+
var e = new EntityAssigned() {Id = id, Name = "a"};
239+
await (session.SaveAsync(e));
240+
await (session.FlushAsync());
241+
await (t.CommitAsync());
242+
}
243+
244+
using (var session = OpenSession())
245+
using(var t = session.BeginTransaction())
246+
{
247+
var child = await (GetTransientProxyAsync(session, id));
248+
var parent = new EntityWithAssignedBag()
249+
{
250+
Id = 1, Name = "p", Children =
251+
{
252+
child
253+
}
254+
};
255+
child.Parent = parent;
256+
257+
await (session.SaveAsync(parent));
258+
await (session.FlushAsync());
259+
260+
await (t.CommitAsync());
261+
}
262+
263+
using (var session = OpenSession())
264+
{
265+
var entity = await (session.GetAsync<EntityAssigned>(id));
266+
Assert.That(entity, Is.Not.Null, "Transient proxy wasn't saved");
267+
}
268+
}
269+
270+
[Test]
271+
public async Task TransientProxyDetectionFromUserCodeAsync()
272+
{
273+
var id = 10;
274+
275+
using (var session = OpenSession())
276+
using (var t = session.BeginTransaction())
277+
{
278+
var e = new EntityAssigned() {Id = id, Name = "a"};
279+
await (session.SaveAsync(e));
280+
await (session.FlushAsync());
281+
await (t.CommitAsync());
282+
}
283+
284+
using (var session = OpenSession())
285+
using (var t = session.BeginTransaction())
286+
{
287+
var child = await (GetTransientProxyAsync(session, id));
288+
Assert.That(await (ForeignKeys.IsTransientSlowAsync(typeof(EntityAssigned).FullName, child, session.GetSessionImplementation(), CancellationToken.None)), Is.True);
289+
await (t.CommitAsync());
290+
}
291+
}
292+
293+
private static async Task<EntityAssigned> GetTransientProxyAsync(ISession session, int id, CancellationToken cancellationToken = default(CancellationToken))
294+
{
295+
EntityAssigned e;
296+
e = await (session.LoadAsync<EntityAssigned>(id, cancellationToken));
297+
e.Name = "b";
298+
await (session.DeleteAsync(e, cancellationToken));
299+
await (session.FlushAsync(cancellationToken));
300+
Assert.That(e.IsProxy(), Is.True, "Failed test set up");
301+
return e;
302+
}
176303
}
177304
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace NHibernate.Test.NHSpecificTest.GH2043
2+
{
3+
public class EntityAssigned
4+
{
5+
public virtual int Id { get; set; }
6+
public virtual string Name { get; set; }
7+
public virtual EntityWithAssignedBag Parent { get; set; }
8+
}
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH2043
4+
{
5+
public class EntityWithAssignedBag
6+
{
7+
public virtual int Id { get; set; }
8+
public virtual string Name { get; set; }
9+
public virtual IList<EntityAssigned> Children { get; set; } = new List<EntityAssigned>();
10+
}
11+
}

src/NHibernate.Test/NHSpecificTest/GH2043/Fixture.cs

Lines changed: 130 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Linq;
33
using NHibernate.Cfg.MappingSchema;
4+
using NHibernate.Engine;
45
using NHibernate.Mapping.ByCode;
6+
using NHibernate.Proxy;
57
using NUnit.Framework;
68

79
namespace NHibernate.Test.NHSpecificTest.GH2043
@@ -49,10 +51,31 @@ protected override HbmMapping GetMappings()
4951
rc.ManyToOne(x => x.EntityLookup, x => x.Class(typeof(EntityWithInterfaceProxyDefinition)));
5052
});
5153

54+
mapper.Class<EntityAssigned>(rc =>
55+
{
56+
rc.Id(x => x.Id, m => m.Generator(Generators.Assigned));
57+
rc.Property(x => x.Name);
58+
rc.ManyToOne(x => x.Parent);
59+
});
60+
61+
mapper.Class<EntityWithAssignedBag>(
62+
rc =>
63+
{
64+
rc.Id(x => x.Id, m => m.Generator(Generators.Assigned));
65+
rc.Property(x => x.Name);
66+
rc.Bag(
67+
x => x.Children,
68+
m =>
69+
{
70+
m.Inverse(true);
71+
m.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
72+
},
73+
cm => { cm.OneToMany(); });
74+
});
75+
5276
return mapper.CompileMappingForAllExplicitlyAddedEntities();
5377
}
5478

55-
5679
protected override void OnSetUp()
5780
{
5881
using(var session = OpenSession())
@@ -113,7 +136,6 @@ protected override void OnSetUp()
113136
}
114137
}
115138

116-
117139
protected override void OnTearDown()
118140
{
119141
using (var session = OpenSession())
@@ -126,7 +148,6 @@ protected override void OnTearDown()
126148
}
127149
}
128150

129-
130151
[Test]
131152
public void UpdateEntityWithClassLookup()
132153
{
@@ -144,7 +165,6 @@ public void UpdateEntityWithClassLookup()
144165
}
145166
}
146167

147-
148168
[Test]
149169
public void UpdateEntityWithInterfaceLookup()
150170
{
@@ -161,5 +181,111 @@ public void UpdateEntityWithInterfaceLookup()
161181
transaction.Commit();
162182
}
163183
}
184+
185+
[Test]
186+
public void TransientProxySave()
187+
{
188+
var id = 10;
189+
190+
using (var session = OpenSession())
191+
using(var t = session.BeginTransaction())
192+
{
193+
var e = new EntityAssigned() {Id = id, Name = "a"};
194+
195+
session.Save(e);
196+
session.Flush();
197+
t.Commit();
198+
}
199+
200+
using (var session = OpenSession())
201+
using(var t = session.BeginTransaction())
202+
{
203+
var e = GetTransientProxy(session, id);
204+
session.Save(e);
205+
session.Flush();
206+
207+
t.Commit();
208+
}
209+
210+
using (var session = OpenSession())
211+
{
212+
var entity = session.Get<EntityAssigned>(id);
213+
Assert.That(entity, Is.Not.Null, "Transient proxy wasn't saved");
214+
}
215+
}
216+
217+
[Test]
218+
public void TransientProxyBagCascadeSave()
219+
{
220+
var id = 10;
221+
222+
using (var session = OpenSession())
223+
using(var t = session.BeginTransaction())
224+
{
225+
var e = new EntityAssigned() {Id = id, Name = "a"};
226+
session.Save(e);
227+
session.Flush();
228+
t.Commit();
229+
}
230+
231+
using (var session = OpenSession())
232+
using(var t = session.BeginTransaction())
233+
{
234+
var child = GetTransientProxy(session, id);
235+
var parent = new EntityWithAssignedBag()
236+
{
237+
Id = 1, Name = "p", Children =
238+
{
239+
child
240+
}
241+
};
242+
child.Parent = parent;
243+
244+
session.Save(parent);
245+
session.Flush();
246+
247+
t.Commit();
248+
}
249+
250+
using (var session = OpenSession())
251+
{
252+
var entity = session.Get<EntityAssigned>(id);
253+
Assert.That(entity, Is.Not.Null, "Transient proxy wasn't saved");
254+
}
255+
}
256+
257+
[Test]
258+
public void TransientProxyDetectionFromUserCode()
259+
{
260+
var id = 10;
261+
262+
using (var session = OpenSession())
263+
using (var t = session.BeginTransaction())
264+
{
265+
var e = new EntityAssigned() {Id = id, Name = "a"};
266+
session.Save(e);
267+
session.Flush();
268+
t.Commit();
269+
}
270+
271+
using (var session = OpenSession())
272+
using (var t = session.BeginTransaction())
273+
{
274+
var child = GetTransientProxy(session, id);
275+
Assert.That(ForeignKeys.IsTransientSlow(typeof(EntityAssigned).FullName, child, session.GetSessionImplementation()), Is.True);
276+
t.Commit();
277+
}
278+
}
279+
280+
private static EntityAssigned GetTransientProxy(ISession session, int id)
281+
{
282+
EntityAssigned e;
283+
e = session.Load<EntityAssigned>(id);
284+
e.Name = "b";
285+
session.Delete(e);
286+
session.Flush();
287+
Assert.That(e.IsProxy(), Is.True, "Failed test set up");
288+
return e;
289+
}
164290
}
165291
}

0 commit comments

Comments
 (0)