1+ namespace AutoMapper . IntegrationTests . Inheritance ;
2+
3+ public class PolymorphismTests : IntegrationTest < PolymorphismTests . DatabaseInitializer >
4+ {
5+ public abstract class Vehicle
6+ {
7+ public int Id { get ; set ; }
8+ public string Name { get ; set ; }
9+ }
10+
11+ public class Car : Vehicle
12+ {
13+ public int AmountDoors { get ; set ; }
14+ }
15+
16+ public class Motorcycle : Vehicle
17+ {
18+ public bool HasSidecar { get ; set ; }
19+ }
20+
21+ public class Bicycle : Vehicle
22+ {
23+ public bool EBike { get ; set ; }
24+ }
25+
26+ public class VehicleModel
27+ {
28+ public string Name { get ; set ; }
29+ }
30+
31+ public class MotorcycleModel : VehicleModel
32+ {
33+ public bool HasSidecar { get ; set ; }
34+ }
35+
36+ public class BicycleModel : VehicleModel
37+ {
38+ public bool EBike { get ; set ; }
39+ }
40+
41+ public class Context : LocalDbContext
42+ {
43+ public DbSet < Vehicle > Vehicles { get ; set ; }
44+
45+ public DbSet < Car > Cars { get ; set ; }
46+
47+ public DbSet < Motorcycle > Motorcycles { get ; set ; }
48+
49+ public DbSet < Bicycle > Bicycles { get ; set ; }
50+ }
51+
52+ protected override MapperConfiguration CreateConfiguration ( )
53+ {
54+ return new MapperConfiguration ( cfg =>
55+ {
56+ cfg . CreateMap < Vehicle , VehicleModel > ( )
57+ . IncludeAllDerived ( ) ;
58+
59+ cfg . CreateMap < Motorcycle , MotorcycleModel > ( ) ;
60+ cfg . CreateMap < Bicycle , BicycleModel > ( ) ;
61+ } ) ;
62+ }
63+
64+ public class DatabaseInitializer : DropCreateDatabaseAlways < Context >
65+ {
66+ protected override void Seed ( Context context )
67+ {
68+ context . Vehicles . Add ( new Car { Name = "Car" , AmountDoors = 4 } ) ;
69+ context . Vehicles . Add ( new Bicycle { Name = "Bicycle" , EBike = true } ) ;
70+ context . Vehicles . Add ( new Motorcycle { Name = "Motorcycle" , HasSidecar = true } ) ;
71+
72+ base . Seed ( context ) ;
73+ }
74+ }
75+
76+ [ Fact ]
77+ public void Should_project_base_queryable_to_derived_models_polymorphic ( )
78+ {
79+ using var context = new Context ( ) ;
80+ var results = context . Vehicles . ProjectTo < VehicleModel > ( Configuration ) . ToArray ( ) ;
81+ results . Length . ShouldBe ( 3 ) ;
82+ results . ShouldContain ( x => x . GetType ( ) == typeof ( VehicleModel ) , 1 ) ;
83+ results . ShouldContain ( x => x . GetType ( ) == typeof ( BicycleModel ) , 1 ) ;
84+ results . ShouldContain ( x => x . GetType ( ) == typeof ( MotorcycleModel ) , 1 ) ;
85+ }
86+
87+ [ Fact ]
88+ public void Should_project_derived_queryable_to_derived_models_if_derived_models_exist ( )
89+ {
90+ using var context = new Context ( ) ;
91+ var results = context . Motorcycles . ProjectTo < MotorcycleModel > ( Configuration ) . ToArray ( ) ;
92+ results . Length . ShouldBe ( 1 ) ;
93+ results . ShouldContain ( x => x . GetType ( ) == typeof ( MotorcycleModel ) , 1 ) ;
94+ }
95+
96+ [ Fact ]
97+ public void Should_project_derived_queryable_to_base_models_if_no_derived_models_exist ( )
98+ {
99+ using var context = new Context ( ) ;
100+ var results = context . Cars . ProjectTo < VehicleModel > ( Configuration ) . ToArray ( ) ;
101+ results . Length . ShouldBe ( 1 ) ;
102+ results . ShouldContain ( x => x . GetType ( ) == typeof ( VehicleModel ) , 1 ) ;
103+ }
104+ }
0 commit comments