@@ -208,6 +208,75 @@ public async Task SameCollectionFetchesAsync()
208208 }
209209 }
210210
211+ //NH-3864 - Cacheable Multicriteria/Future'd query with aliased join throw exception
212+ [ Test ]
213+ public void CacheableCriteriaWithAliasedJoinFutureAsync ( )
214+ {
215+ using ( var session = OpenSession ( ) )
216+ {
217+ EntitySimpleChild child1 = null ;
218+ var ecFuture = session . QueryOver < EntityComplex > ( )
219+ . JoinAlias ( c => c . Child1 , ( ) => child1 )
220+ . Where ( c => c . Id == _parentId )
221+ . Cacheable ( )
222+ . FutureValue ( ) ;
223+ EntityComplex value = null ;
224+ Assert . DoesNotThrowAsync ( async ( ) => value = await ( ecFuture . GetValueAsync ( ) ) ) ;
225+ Assert . That ( value , Is . Not . Null ) ;
226+ }
227+
228+ using ( var sqlLog = new SqlLogSpy ( ) )
229+ using ( var session = OpenSession ( ) )
230+ {
231+ EntitySimpleChild child1 = null ;
232+ var ecFuture = session . QueryOver < EntityComplex > ( )
233+ . JoinAlias ( c => c . Child1 , ( ) => child1 )
234+ . Where ( c => c . Id == _parentId )
235+ . Cacheable ( )
236+ . FutureValue ( ) ;
237+ EntityComplex value = null ;
238+ Assert . DoesNotThrowAsync ( async ( ) => value = await ( ecFuture . GetValueAsync ( ) ) ) ;
239+ Assert . That ( value , Is . Not . Null ) ;
240+
241+ Assert . That ( sqlLog . Appender . GetEvents ( ) . Length , Is . EqualTo ( 0 ) , "Query is expected to be retrieved from cache" ) ;
242+ }
243+ }
244+
245+ //NH-3334 - 'collection is not associated with any session' upon refreshing objects from QueryOver<>().Future<>()
246+ [ KnownBug ( "NH-3334" ) ]
247+ [ Test ]
248+ public async Task RefreshFutureWithEagerCollectionsAsync ( )
249+ {
250+ using ( var session = OpenSession ( ) )
251+ {
252+ var ecFutureList = session . QueryOver < EntityEager > ( ) . Future ( ) ;
253+
254+ foreach ( var ec in await ( ecFutureList . GetEnumerableAsync ( ) ) )
255+ {
256+ //trouble causes ec.ChildrenListEager with eager select mapping
257+ Assert . DoesNotThrowAsync ( ( ) => session . RefreshAsync ( ec ) , "session.Refresh should not throw exception" ) ;
258+ }
259+ }
260+ }
261+
262+ //Related to NH-3334. Eager mappings are not fetched by Future
263+ [ KnownBug ( "NH-3334" ) ]
264+ [ Test ]
265+ public async Task FutureForEagerMappedCollectionAsync ( )
266+ {
267+ //Note: This behavior might be considered as feature but it's not documented.
268+ //Quirk: if this query is also cached - results will be still eager loaded when values retrieved from cache
269+ using ( var session = OpenSession ( ) )
270+ {
271+ var futureValue = session . QueryOver < EntityEager > ( ) . Where ( e => e . Id == _eagerId ) . FutureValue ( ) ;
272+
273+ Assert . That ( await ( futureValue . GetValueAsync ( ) ) , Is . Not . Null ) ;
274+ Assert . That ( NHibernateUtil . IsInitialized ( await ( futureValue . GetValueAsync ( ) ) ) , Is . True ) ;
275+ Assert . That ( NHibernateUtil . IsInitialized ( ( await ( futureValue . GetValueAsync ( ) ) ) . ChildrenListEager ) , Is . True ) ;
276+ Assert . That ( NHibernateUtil . IsInitialized ( ( await ( futureValue . GetValueAsync ( ) ) ) . ChildrenListSubselect ) , Is . True ) ;
277+ }
278+ }
279+
211280 #region Test Setup
212281
213282 protected override HbmMapping GetMappings ( )
0 commit comments