@@ -47,10 +47,49 @@ protected override void OnSetUp()
47
47
}
48
48
}
49
49
50
+ private void PrepareDataForEntityProjectionTests ( out Student gavin , out string courseCode )
51
+ {
52
+ courseCode = "HIB" ;
53
+ using ( ISession session = Sfi . OpenSession ( ) )
54
+ using ( ITransaction tx = session . BeginTransaction ( ) )
55
+ {
56
+ Course course = new Course
57
+ {
58
+ CourseCode = "HIB" ,
59
+ Description = "Hibernate Training"
60
+ } ;
61
+ session . Save ( course ) ;
62
+
63
+ gavin = new Student
64
+ {
65
+ Name = "Gavin King" ,
66
+ StudentNumber = 667 ,
67
+
68
+ } ;
69
+ session . Save ( gavin ) ;
70
+
71
+ Enrolment enrolment = new Enrolment
72
+ {
73
+ Course = course ,
74
+ CourseCode = course . CourseCode ,
75
+ Semester = 1 ,
76
+ Year = 1999 ,
77
+ Student = gavin ,
78
+ StudentNumber = gavin . StudentNumber
79
+ } ;
80
+ gavin . Enrolments . Add ( enrolment ) ;
81
+ session . Save ( enrolment ) ;
82
+
83
+ session . Flush ( ) ;
84
+ tx . Commit ( ) ;
85
+ }
86
+ }
87
+
50
88
protected override void OnTearDown ( )
51
89
{
52
90
using ( ISession session = Sfi . OpenSession ( ) )
53
91
{
92
+ session . Delete ( $ "from { typeof ( Enrolment ) . FullName } ") ;
54
93
session . Delete ( "from System.Object" ) ;
55
94
session . Flush ( ) ;
56
95
}
@@ -435,80 +474,108 @@ public void UseSubquerySumWithNullResultWithProjection()
435
474
}
436
475
437
476
[ Test ]
438
- public void UseRootProjection ( )
477
+ public void UseRootProjection_Eager ( )
439
478
{
440
479
//NH-3435
480
+ PrepareDataForEntityProjectionTests ( out Student gavin , out string _ ) ;
481
+
441
482
using ( ISession session = Sfi . OpenSession ( ) )
442
- using ( ITransaction tx = session . BeginTransaction ( ) )
443
483
{
444
- Course course = new Course ( ) ;
445
- course . CourseCode = "HIB" ;
446
- course . Description = "Hibernate Training" ;
447
- session . Save ( course ) ;
448
-
449
- Student gavin = new Student ( ) ;
450
- gavin . Name = "Gavin King" ;
451
- gavin . StudentNumber = 667 ;
452
- session . Save ( gavin ) ;
484
+ Student g = session . CreateCriteria ( typeof ( Student ) )
485
+ . Add ( Expression . IdEq ( gavin . StudentNumber ) )
486
+ . SetFetchMode ( "Enrolments" , FetchMode . Join )
487
+ . SetProjection ( Projections . RootEntity ( lazy : false ) )
488
+ . UniqueResult < Student > ( ) ;
453
489
454
- Enrolment enrolment = new Enrolment ( ) ;
455
- enrolment . Course = course ;
456
- enrolment . CourseCode = course . CourseCode ;
457
- enrolment . Semester = 1 ;
458
- enrolment . Year = 1999 ;
459
- enrolment . Student = gavin ;
460
- enrolment . StudentNumber = gavin . StudentNumber ;
461
- gavin . Enrolments . Add ( enrolment ) ;
462
- session . Save ( enrolment ) ;
490
+ Assert . That ( NHibernateUtil . IsInitialized ( g ) , Is . True , "object must be initialized" ) ;
491
+ Assert . That ( g , Is . EqualTo ( gavin ) . Using ( ( Student x , Student y ) => x . StudentNumber == y . StudentNumber && x . Name == y . Name ? 0 : 1 ) ) ;
492
+ }
493
+ }
463
494
464
- session . Flush ( ) ;
495
+ [ Test ]
496
+ public void UseRootProjection_Lazy ( )
497
+ {
498
+ PrepareDataForEntityProjectionTests ( out Student gavin , out string _ ) ;
465
499
500
+ //NH-3435
501
+ using ( ISession session = Sfi . OpenSession ( ) )
502
+ {
466
503
Student g = session . CreateCriteria ( typeof ( Student ) )
467
- . Add ( Expression . IdEq ( gavin . StudentNumber ) )
468
- . SetFetchMode ( "Enrolments" , FetchMode . Join )
469
- . SetProjection ( Projections . RootEntity ( ) )
470
- . UniqueResult < Student > ( ) ;
504
+ . Add ( Expression . IdEq ( gavin . StudentNumber ) )
505
+ . SetFetchMode ( "Enrolments" , FetchMode . Join )
506
+ . SetProjection ( Projections . RootEntity ( lazy : false ) )
507
+ . UniqueResult < Student > ( ) ;
508
+
509
+ Assert . That ( NHibernateUtil . IsInitialized ( g ) , Is . False , "object must be lazy and not initialized" ) ;
510
+ Assert . That ( g , Is . EqualTo ( gavin ) . Using ( ( Student x , Student y ) => x . StudentNumber == y . StudentNumber && x . Name == y . Name ? 0 : 1 ) ) ;
511
+ }
512
+ }
513
+
514
+ [ Test ]
515
+ public void UseEntityProjection_Eager ( )
516
+ {
517
+ //NH-3435
518
+ PrepareDataForEntityProjectionTests ( out Student gavin , out string courseCode ) ;
519
+
520
+ using ( ISession session = Sfi . OpenSession ( ) )
521
+ {
522
+ Student g = session . CreateCriteria ( typeof ( Enrolment ) )
523
+ . Add ( Expression . And ( Expression . Eq ( "StudentNumber" , gavin . StudentNumber ) , Expression . Eq ( "CourseCode" , courseCode ) ) )
524
+ . CreateAlias ( "Student" , "s" , JoinType . InnerJoin )
525
+ . SetProjection ( Projections . Entity < Student > ( "s" , lazy : false ) )
526
+ . UniqueResult < Student > ( ) ;
471
527
472
- Assert . AreSame ( gavin , g ) ;
528
+ Assert . That ( NHibernateUtil . IsInitialized ( g ) , Is . True , "object must be initialized" ) ;
529
+ Assert . That ( g , Is . EqualTo ( gavin ) . Using ( ( Student x , Student y ) => x . StudentNumber == y . StudentNumber && x . Name == y . Name ? 0 : 1 ) ) ;
473
530
}
474
531
}
475
532
476
533
[ Test ]
477
- public void UseEntityProjection ( )
534
+ public void UseEntityProjection_Lazy ( )
478
535
{
479
536
//NH-3435
537
+ PrepareDataForEntityProjectionTests ( out Student gavin , out string courseCode ) ;
538
+
480
539
using ( ISession session = Sfi . OpenSession ( ) )
481
540
using ( ITransaction tx = session . BeginTransaction ( ) )
482
541
{
483
- Course course = new Course ( ) ;
484
- course . CourseCode = "HIB" ;
485
- course . Description = "Hibernate Training" ;
486
- session . Save ( course ) ;
542
+ Student g = session . CreateCriteria ( typeof ( Enrolment ) )
543
+ . Add ( Expression . And ( Expression . Eq ( "StudentNumber" , gavin . StudentNumber ) , Expression . Eq ( "CourseCode" , courseCode ) ) )
544
+ . CreateAlias ( "Student" , "s" , JoinType . InnerJoin )
545
+ . SetProjection ( Projections . Entity < Student > ( "s" , lazy : false ) )
546
+ . UniqueResult < Student > ( ) ;
487
547
488
- Student gavin = new Student ( ) ;
489
- gavin . Name = "Gavin King" ;
490
- gavin . StudentNumber = 667 ;
491
- session . Save ( gavin ) ;
548
+ Assert . That ( NHibernateUtil . IsInitialized ( g ) , Is . True , "object must be initialized" ) ;
549
+ Assert . That ( g , Is . EqualTo ( gavin ) . Using ( ( Student x , Student y ) => x . StudentNumber == y . StudentNumber && x . Name == y . Name ? 0 : 1 ) ) ;
550
+ }
551
+ }
492
552
493
- Enrolment enrolment = new Enrolment ( ) ;
494
- enrolment . Course = course ;
495
- enrolment . CourseCode = course . CourseCode ;
496
- enrolment . Semester = 1 ;
497
- enrolment . Year = 1999 ;
498
- enrolment . Student = gavin ;
499
- enrolment . StudentNumber = gavin . StudentNumber ;
500
- gavin . Enrolments . Add ( enrolment ) ;
501
- session . Save ( enrolment ) ;
553
+ [ Test ]
554
+ public void UseMultipleEntityProjections ( )
555
+ {
556
+ //NH-3435
557
+ PrepareDataForEntityProjectionTests ( out Student gavin , out string courseCode ) ;
502
558
503
- session . Flush ( ) ;
559
+ using ( ISession session = Sfi . OpenSession ( ) )
560
+ {
561
+ Enrolment en = null ;
562
+ Student s = null ;
563
+ Course c = null ;
504
564
505
- Student g = session . CreateCriteria ( typeof ( Enrolment ) )
506
- . Add ( Expression . And ( Expression . Eq ( "StudentNumber" , gavin . StudentNumber ) , Expression . Eq ( "CourseCode" , course . CourseCode ) ) )
507
- . CreateAlias ( "Student" , "s" , JoinType . InnerJoin )
508
- . SetProjection ( Projections . Entity < Student > ( "s" ) )
509
- . UniqueResult < Student > ( ) ;
565
+ var result = session . QueryOver ( ( ) => en )
566
+ . Where ( e => e . StudentNumber == gavin . StudentNumber && e . CourseCode == courseCode )
567
+ . JoinAlias ( e => e . Student , ( ) => s )
568
+ . JoinAlias ( e => e . Course , ( ) => c )
569
+ . Select ( Projections . RootEntity ( lazy : true ) , Projections . Entity ( ( ) => s , lazy : false ) , Projections . Entity ( ( ) => c , lazy : false ) )
570
+ . SingleOrDefault < object [ ] > ( ) ;
571
+
572
+ en = ( Enrolment ) result [ 0 ] ;
573
+ s = ( Student ) result [ 1 ] ;
574
+ c = ( Course ) result [ 2 ] ;
510
575
511
- Assert . AreSame ( gavin , g ) ;
576
+ Assert . That ( NHibernateUtil . IsInitialized ( en ) , Is . False , "Object must be lazy and not initialized" ) ;
577
+ Assert . That ( NHibernateUtil . IsInitialized ( s ) , Is . True , "Object must be initialized" ) ;
578
+ Assert . That ( NHibernateUtil . IsInitialized ( c ) , Is . True , "Object must be initialized" ) ;
512
579
}
513
580
}
514
581
}
0 commit comments