9
9
10
10
11
11
using System ;
12
- using NHibernate . Cfg ;
13
12
using NHibernate . Criterion ;
14
13
using NHibernate . Transform ;
15
14
using NUnit . Framework ;
16
15
17
16
namespace NHibernate . Test . NHSpecificTest . NH750
18
17
{
19
18
using System . Threading . Tasks ;
20
- [ TestFixture ]
19
+ [ TestFixture ( 0 ) ]
20
+ [ TestFixture ( 1 ) ]
21
+ [ TestFixture ( 2 ) ]
21
22
public class ManyToManyNotFoundIgnoreFixtureAsync : BugTestCase
22
23
{
23
24
private int id1 ;
24
25
private int id2 ;
26
+ private int _drive2Id ;
27
+ private readonly int _drivesCount ;
28
+ private int DrivesCountWithOneIgnored => _drivesCount == 0 ? 0 : _drivesCount - 1 ;
29
+
30
+ public ManyToManyNotFoundIgnoreFixtureAsync ( int drivesCount )
31
+ {
32
+ _drivesCount = drivesCount ;
33
+ }
25
34
26
35
protected override void OnSetUp ( )
27
36
{
@@ -34,12 +43,12 @@ protected override void OnSetUp()
34
43
using ( var t = s . BeginTransaction ( ) )
35
44
{
36
45
s . Save ( dr1 ) ;
37
- s . Save ( dr2 ) ;
46
+ _drive2Id = ( int ) s . Save ( dr2 ) ;
38
47
s . Save ( dr3 ) ;
39
- dv1 . Drives . Add ( dr1 ) ;
40
- dv1 . Drives . Add ( dr2 ) ;
41
- dv2 . Drives . Add ( dr1 ) ;
42
- dv2 . Drives . Add ( dr3 ) ;
48
+ AddDrive ( dv1 , dr2 ) ;
49
+ AddDrive ( dv1 , dr1 ) ;
50
+ AddDrive ( dv2 , dr3 ) ;
51
+ AddDrive ( dv2 , dr1 ) ;
43
52
44
53
id1 = ( int ) s . Save ( dv1 ) ;
45
54
id2 = ( int ) s . Save ( dv2 ) ;
@@ -51,15 +60,22 @@ protected override void OnSetUp()
51
60
}
52
61
}
53
62
63
+ private void AddDrive ( Device dv , Drive drive )
64
+ {
65
+ if ( dv . Drives . Count >= _drivesCount )
66
+ return ;
67
+ dv . Drives . Add ( drive ) ;
68
+ }
69
+
54
70
protected override void OnTearDown ( )
55
71
{
56
- using ( ISession s = Sfi . OpenSession ( ) )
57
- using ( var t = s . BeginTransaction ( ) )
58
- {
59
- s . Delete ( " from Device" ) ;
60
- s . Delete ( "from Drive " ) ;
61
- t . Commit ( ) ;
62
- }
72
+ using var s = Sfi . OpenSession ( ) ;
73
+ using var t = s . BeginTransaction ( ) ;
74
+
75
+ s . CreateSQLQuery ( "delete from DriveOfDevice" ) . ExecuteUpdate ( ) ;
76
+ s . Delete ( "from Device " ) ;
77
+ s . Delete ( "from Drive" ) ;
78
+ t . Commit ( ) ;
63
79
}
64
80
65
81
[ Test ]
@@ -73,9 +89,9 @@ public async Task DeviceOfDriveAsync()
73
89
dv2 = ( Device ) await ( s . LoadAsync ( typeof ( Device ) , id2 ) ) ;
74
90
}
75
91
76
- Assert . That ( dv1 . Drives , Has . Count . EqualTo ( 2 ) . And . None . Null ) ;
92
+ Assert . That ( dv1 . Drives , Has . Count . EqualTo ( _drivesCount ) . And . None . Null ) ;
77
93
// Verify one is missing
78
- Assert . That ( dv2 . Drives , Has . Count . EqualTo ( 1 ) . And . None . Null ) ;
94
+ Assert . That ( dv2 . Drives , Has . Count . EqualTo ( DrivesCountWithOneIgnored ) . And . None . Null ) ;
79
95
80
96
//Make sure that flush didn't touch not-found="ignore" records for not modified collection
81
97
using ( var s = Sfi . OpenSession ( ) )
@@ -86,18 +102,23 @@ public async Task DeviceOfDriveAsync()
86
102
await ( t . CommitAsync ( ) ) ;
87
103
}
88
104
89
- await ( VerifyResultAsync ( expectedInCollection : 1 , expectedInDb : 2 , msg : "not modified collection" ) ) ;
105
+ await ( VerifyResultAsync ( expectedInCollection : DrivesCountWithOneIgnored , expectedInDb : _drivesCount , msg : "not modified collection" ) ) ;
106
+
107
+ // Many-to-many clears collection and recreates it so not-found ignore records are lost
108
+ // Note: It's not the case when no valid records are present, so loaded Drives collection is empty
109
+ // Just skip this check in this case:
110
+ if ( _drivesCount < 2 )
111
+ return ;
90
112
91
- //Many-to-many clears collection and recreates it so not-found ignore records are lost
92
113
using ( var s = Sfi . OpenSession ( ) )
93
114
using ( var t = s . BeginTransaction ( ) )
94
115
{
95
116
dv2 = await ( s . GetAsync < Device > ( dv2 . Id ) ) ;
96
- dv2 . Drives . Add ( dv1 . Drives [ 1 ] ) ;
117
+ dv2 . Drives . Add ( await ( s . LoadAsync < Drive > ( _drive2Id ) ) ) ;
97
118
await ( t . CommitAsync ( ) ) ;
98
119
}
99
120
100
- await ( VerifyResultAsync ( 2 , 2 , msg : "modified collection" ) ) ;
121
+ await ( VerifyResultAsync ( _drivesCount , _drivesCount , msg : "modified collection" ) ) ;
101
122
102
123
async Task VerifyResultAsync ( int expectedInCollection , int expectedInDb , string msg )
103
124
{
@@ -127,23 +148,23 @@ public async Task QueryOverFetchAsync()
127
148
. SingleOrDefaultAsync ( ) ) ;
128
149
129
150
Assert . That ( NHibernateUtil . IsInitialized ( dv2 . Drives ) , Is . True ) ;
130
- Assert . That ( dv2 . Drives , Has . Count . EqualTo ( 1 ) . And . None . Null ) ;
151
+ Assert . That ( dv2 . Drives , Has . Count . EqualTo ( DrivesCountWithOneIgnored ) . And . None . Null ) ;
131
152
}
132
153
}
133
154
134
155
[ Test ]
135
156
public async Task HqlFetchAsync ( )
136
157
{
137
- using ( var s = OpenSession ( ) )
138
- {
139
- var dv2 = await ( s . CreateQuery ( "from Device d left join fetch d.Drives where d.id = :id" )
140
- . SetResultTransformer ( Transformers . DistinctRootEntity )
141
- . SetParameter ( "id" , id2 )
142
- . UniqueResultAsync < Device > ( ) ) ;
143
-
144
- Assert . That ( NHibernateUtil . IsInitialized ( dv2 . Drives ) , Is . True ) ;
145
- Assert . That ( dv2 . Drives , Has . Count . EqualTo ( 1 ) . And . None . Null ) ;
146
- }
158
+ using var log = new SqlLogSpy ( ) ;
159
+ using var s = OpenSession ( ) ;
160
+ var dv2 = await ( s . CreateQuery ( "from Device d left join fetch d.Drives where d.id = :id" )
161
+ . SetResultTransformer ( Transformers . DistinctRootEntity )
162
+ . SetParameter ( "id" , id2 )
163
+ . UniqueResultAsync < Device > ( ) ) ;
164
+
165
+ Assert . That ( NHibernateUtil . IsInitialized ( dv2 . Drives ) , Is . True ) ;
166
+ Assert . That ( dv2 . Drives , Has . Count . EqualTo ( DrivesCountWithOneIgnored ) . And . None . Null ) ;
167
+ Assert . That ( log . Appender . GetEvents ( ) . Length , Is . EqualTo ( 1 ) ) ;
147
168
}
148
169
149
170
[ Test ]
@@ -155,7 +176,7 @@ public async Task LazyLoadAsync()
155
176
await ( NHibernateUtil . InitializeAsync ( dv2 . Drives ) ) ;
156
177
157
178
Assert . That ( NHibernateUtil . IsInitialized ( dv2 . Drives ) , Is . True ) ;
158
- Assert . That ( dv2 . Drives , Has . Count . EqualTo ( 1 ) . And . None . Null ) ;
179
+ Assert . That ( dv2 . Drives , Has . Count . EqualTo ( DrivesCountWithOneIgnored ) . And . None . Null ) ;
159
180
}
160
181
}
161
182
}
0 commit comments