Skip to content

Commit a22f00f

Browse files
Support multiple properties in select id generator
Co-Authored-by: Frédéric Delaporte <12201973+fredericdelaporte@users.noreply.github.com>
1 parent 33c1555 commit a22f00f

File tree

11 files changed

+515
-52
lines changed

11 files changed

+515
-52
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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 NHibernate.Dialect;
12+
using NUnit.Framework;
13+
14+
namespace NHibernate.Test.NHSpecificTest.NH3150
15+
{
16+
using System.Threading.Tasks;
17+
[TestFixture]
18+
public class SelectGeneratorFixtureAsync : BugTestCase
19+
{
20+
protected override bool AppliesTo(Dialect.Dialect dialect)
21+
{
22+
// Test uses SQL-Server "instead of insert" triggers.
23+
return dialect is MsSql2008Dialect;
24+
}
25+
26+
protected override void OnTearDown()
27+
{
28+
using (var s = OpenSession())
29+
using (var tx = s.BeginTransaction())
30+
{
31+
s.CreateQuery("delete from System.Object").ExecuteUpdate();
32+
tx.Commit();
33+
}
34+
}
35+
36+
[Test]
37+
public async Task CanUseNaturalIdWithMoreThanOnePropertyAsync()
38+
{
39+
using (var s = OpenSession())
40+
using (var tx = s.BeginTransaction())
41+
{
42+
var worker = new Worker
43+
{
44+
Name = "Mr Black",
45+
Position = "Managing Director"
46+
};
47+
await (s.SaveAsync(worker));
48+
49+
var worker2 = new Worker
50+
{
51+
Name = "Mr Black",
52+
Position = "Director"
53+
};
54+
await (s.SaveAsync(worker2));
55+
56+
await (tx.CommitAsync());
57+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
58+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
59+
}
60+
}
61+
62+
[Test]
63+
public async Task CanUseKeyWithMoreThanOnePropertyAsync()
64+
{
65+
using (var s = OpenSession())
66+
using (var tx = s.BeginTransaction())
67+
{
68+
var worker = new WorkerWithExplicitKey
69+
{
70+
Name = "Mr Black",
71+
Position = "Managing Director"
72+
};
73+
await (s.SaveAsync(worker));
74+
75+
var worker2 = new WorkerWithExplicitKey
76+
{
77+
Name = "Mr Black",
78+
Position = "Director"
79+
};
80+
await (s.SaveAsync(worker2));
81+
82+
await (tx.CommitAsync());
83+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
84+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
85+
}
86+
}
87+
88+
// Non-regression test case.
89+
[Test]
90+
public async Task CanUseComponentAsNaturalIdAsync()
91+
{
92+
using (var s = OpenSession())
93+
using (var tx = s.BeginTransaction())
94+
{
95+
var worker = new WorkerWithComponent
96+
{
97+
Nid = new WorkerWithComponent.NidComponent
98+
{
99+
Name = "Mr Black",
100+
Position = "Managing Director"
101+
}
102+
};
103+
await (s.SaveAsync(worker));
104+
105+
var worker2 = new WorkerWithComponent
106+
{
107+
Nid = new WorkerWithComponent.NidComponent
108+
{
109+
Name = "Mr Black",
110+
Position = "Director"
111+
}
112+
};
113+
await (s.SaveAsync(worker2));
114+
115+
await (tx.CommitAsync());
116+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
117+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
118+
}
119+
}
120+
}
121+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3150
2+
{
3+
public class Worker
4+
{
5+
public virtual int? Id { get; set; }
6+
7+
public virtual string Name { get; set; }
8+
public virtual string Position { get; set; }
9+
}
10+
11+
public class WorkerWithExplicitKey
12+
{
13+
public virtual int? Id { get; set; }
14+
15+
public virtual string Name { get; set; }
16+
public virtual string Position { get; set; }
17+
}
18+
19+
public class WorkerWithComponent
20+
{
21+
public virtual int? Id { get; set; }
22+
public virtual NidComponent Nid { get; set; }
23+
24+
public class NidComponent
25+
{
26+
public virtual string Name { get; set; }
27+
public virtual string Position { get; set; }
28+
// No need to implement Equals for what the test does.
29+
}
30+
}
31+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
namespace="NHibernate.Test.NHSpecificTest.NH3150"
4+
assembly="NHibernate.Test">
5+
<class name="Worker">
6+
<id name="Id">
7+
<generator class="select"/>
8+
</id>
9+
10+
<natural-id>
11+
<property name="Name"/>
12+
<property name="Position"/>
13+
</natural-id>
14+
</class>
15+
16+
<class name="WorkerWithExplicitKey">
17+
<id name="Id">
18+
<generator class="select">
19+
<param name="key">Name, Position</param>
20+
</generator>
21+
</id>
22+
23+
<property name="Name"/>
24+
<property name="Position"/>
25+
</class>
26+
27+
<class name="WorkerWithComponent">
28+
<id name="Id">
29+
<generator class="select"/>
30+
</id>
31+
32+
<natural-id>
33+
<component name="Nid">
34+
<property name="Name"/>
35+
<property name="Position"/>
36+
</component>
37+
</natural-id>
38+
</class>
39+
40+
<database-object>
41+
<create>
42+
CREATE TRIGGER dbo.id_gen_Worker ON dbo.Worker
43+
INSTEAD OF INSERT
44+
AS
45+
BEGIN
46+
SET NOCOUNT ON;
47+
48+
declare @lastval int
49+
set @lastval = (select max(Id) from Worker)
50+
if @lastval is null set @lastval = 0
51+
52+
SELECT * INTO #Inserted FROM Inserted
53+
UPDATE #Inserted set Id = @lastval+1
54+
SET NOCOUNT OFF;
55+
INSERT INTO Worker SELECT * FROM #Inserted
56+
END
57+
</create>
58+
<drop>
59+
DROP TRIGGER dbo.id_gen_Worker;
60+
</drop>
61+
</database-object>
62+
63+
<database-object>
64+
<create>
65+
CREATE TRIGGER dbo.id_gen_WorkerWithExplicitKey ON dbo.WorkerWithExplicitKey
66+
INSTEAD OF INSERT
67+
AS
68+
BEGIN
69+
SET NOCOUNT ON;
70+
71+
declare @lastval int
72+
set @lastval = (select max(Id) from WorkerWithExplicitKey)
73+
if @lastval is null set @lastval = 0
74+
75+
SELECT * INTO #Inserted FROM Inserted
76+
UPDATE #Inserted set Id = @lastval+1
77+
SET NOCOUNT OFF;
78+
INSERT INTO WorkerWithExplicitKey SELECT * FROM #Inserted
79+
END
80+
</create>
81+
<drop>
82+
DROP TRIGGER dbo.id_gen_WorkerWithExplicitKey;
83+
</drop>
84+
</database-object>
85+
86+
<database-object>
87+
<create>
88+
CREATE TRIGGER dbo.id_gen_WorkerWithComponent ON dbo.WorkerWithComponent
89+
INSTEAD OF INSERT
90+
AS
91+
BEGIN
92+
SET NOCOUNT ON;
93+
94+
declare @lastval int
95+
set @lastval = (select max(Id) from WorkerWithComponent)
96+
if @lastval is null set @lastval = 0
97+
98+
SELECT * INTO #Inserted FROM Inserted
99+
UPDATE #Inserted set Id = @lastval+1
100+
SET NOCOUNT OFF;
101+
INSERT INTO WorkerWithComponent SELECT * FROM #Inserted
102+
END
103+
</create>
104+
<drop>
105+
DROP TRIGGER dbo.id_gen_WorkerWithComponent;
106+
</drop>
107+
</database-object>
108+
</hibernate-mapping>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using NHibernate.Dialect;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3150
5+
{
6+
[TestFixture]
7+
public class SelectGeneratorFixture : BugTestCase
8+
{
9+
protected override bool AppliesTo(Dialect.Dialect dialect)
10+
{
11+
// Test uses SQL-Server "instead of insert" triggers.
12+
return dialect is MsSql2008Dialect;
13+
}
14+
15+
protected override void OnTearDown()
16+
{
17+
using (var s = OpenSession())
18+
using (var tx = s.BeginTransaction())
19+
{
20+
s.CreateQuery("delete from System.Object").ExecuteUpdate();
21+
tx.Commit();
22+
}
23+
}
24+
25+
[Test]
26+
public void CanUseNaturalIdWithMoreThanOneProperty()
27+
{
28+
using (var s = OpenSession())
29+
using (var tx = s.BeginTransaction())
30+
{
31+
var worker = new Worker
32+
{
33+
Name = "Mr Black",
34+
Position = "Managing Director"
35+
};
36+
s.Save(worker);
37+
38+
var worker2 = new Worker
39+
{
40+
Name = "Mr Black",
41+
Position = "Director"
42+
};
43+
s.Save(worker2);
44+
45+
tx.Commit();
46+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
47+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
48+
}
49+
}
50+
51+
[Test]
52+
public void CanUseKeyWithMoreThanOneProperty()
53+
{
54+
using (var s = OpenSession())
55+
using (var tx = s.BeginTransaction())
56+
{
57+
var worker = new WorkerWithExplicitKey
58+
{
59+
Name = "Mr Black",
60+
Position = "Managing Director"
61+
};
62+
s.Save(worker);
63+
64+
var worker2 = new WorkerWithExplicitKey
65+
{
66+
Name = "Mr Black",
67+
Position = "Director"
68+
};
69+
s.Save(worker2);
70+
71+
tx.Commit();
72+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
73+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
74+
}
75+
}
76+
77+
// Non-regression test case.
78+
[Test]
79+
public void CanUseComponentAsNaturalId()
80+
{
81+
using (var s = OpenSession())
82+
using (var tx = s.BeginTransaction())
83+
{
84+
var worker = new WorkerWithComponent
85+
{
86+
Nid = new WorkerWithComponent.NidComponent
87+
{
88+
Name = "Mr Black",
89+
Position = "Managing Director"
90+
}
91+
};
92+
s.Save(worker);
93+
94+
var worker2 = new WorkerWithComponent
95+
{
96+
Nid = new WorkerWithComponent.NidComponent
97+
{
98+
Name = "Mr Black",
99+
Position = "Director"
100+
}
101+
};
102+
s.Save(worker2);
103+
104+
tx.Commit();
105+
Assert.That(worker.Id, Is.EqualTo(1), "Id of first worker should be 1");
106+
Assert.That(worker2.Id, Is.EqualTo(2), "Id of second worker should be 2");
107+
}
108+
}
109+
}
110+
}

0 commit comments

Comments
 (0)