@@ -199,6 +199,46 @@ public void WriteCode_Should_Generate_Entity_Files(bool useDataAnnotations, stri
199199 Assert . Equal ( expectedProduct , product ) ;
200200 }
201201
202+ [ Theory ]
203+ [ InlineData ( "en-US" ) ]
204+ [ InlineData ( "tr-TR" ) ]
205+ public void WriteCode_Should_Generate_Entities_With_Nullable_Navigation_When_Configured ( string culture )
206+ {
207+ // Arrange
208+ Thread . CurrentThread . CurrentCulture = new CultureInfo ( culture ) ;
209+ var revEngOptions = ReverseEngineerOptions . EntitiesOnly ;
210+ var scaffolder = CreateScaffolder ( revEngOptions , options => {
211+ options . EnableNullableReferenceTypes = true ;
212+ } ) ;
213+
214+ // Act
215+ var model = scaffolder . ScaffoldModel (
216+ connectionString : Constants . Connections . SqlServerConnection ,
217+ databaseOptions : new DatabaseModelFactoryOptions ( ) ,
218+ modelOptions : new ModelReverseEngineerOptions ( ) ,
219+ codeOptions : new ModelCodeGenerationOptions
220+ {
221+ ContextNamespace = Constants . Parameters . RootNamespace ,
222+ ModelNamespace = Constants . Parameters . RootNamespace ,
223+ ContextName = Constants . Parameters . ContextName ,
224+ ContextDir = Constants . Parameters . ProjectPath ,
225+ UseDataAnnotations = false ,
226+ Language = "C#" ,
227+ } ) ;
228+
229+ // Assert
230+ var files = GetGeneratedFiles ( model , revEngOptions ) ;
231+ var category = files [ Constants . Files . CSharpFiles . CategoryFile ] ;
232+ var product = files [ Constants . Files . CSharpFiles . ProductFile ] ;
233+
234+ object expectedCategory ;
235+ object expectedProduct ;
236+ expectedCategory = ExpectedEntitiesWithNullableNavigation . CategoryClass ;
237+ expectedProduct = ExpectedEntitiesWithNullableNavigation . ProductClass ;
238+ Assert . Equal ( expectedCategory , category ) ;
239+ Assert . Equal ( expectedProduct , product ) ;
240+ }
241+
202242 [ Theory ]
203243 [ InlineData ( false , "en-US" ) ]
204244 [ InlineData ( true , "en-US" ) ]
@@ -394,7 +434,12 @@ public void Save_Should_Write_Context_and_Entity_Files()
394434 }
395435 }
396436
397- private IReverseEngineerScaffolder CreateScaffolder ( ReverseEngineerOptions options , string filenamePrefix = null )
437+ private IReverseEngineerScaffolder CreateScaffolder ( ReverseEngineerOptions revEngOptions , string filenamePrefix = null )
438+ {
439+ return CreateScaffolder ( revEngOptions , _ => { } , filenamePrefix ) ;
440+ }
441+
442+ private IReverseEngineerScaffolder CreateScaffolder ( ReverseEngineerOptions revEngOptions , Action < HandlebarsScaffoldingOptions > configureOptions , string filenamePrefix = null )
398443 {
399444 var fileService = new InMemoryTemplateFileService ( ) ;
400445 fileService . InputFiles ( ContextClassTemplate , ContextImportsTemplate ,
@@ -407,7 +452,10 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
407452 . AddSingleton < IEntityTypeTemplateService , FakeHbsEntityTypeTemplateService > ( )
408453 . AddSingleton < ITemplateFileService > ( fileService )
409454 . AddSingleton < ITemplateLanguageService , FakeCSharpTemplateLanguageService > ( )
410- . AddSingleton < IModelCodeGenerator , HbsCSharpModelGenerator > ( )
455+ . AddSingleton < IModelCodeGenerator , HbsCSharpModelGenerator > ( ) ;
456+
457+ #pragma warning disable EF1001 // Internal EF Core API usage.
458+ services
411459 . AddSingleton ( provider =>
412460 {
413461 ICSharpDbContextGenerator contextGenerator = new HbsCSharpDbContextGenerator (
@@ -417,8 +465,8 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
417465 provider . GetRequiredService < IEntityTypeTransformationService > ( ) ,
418466 provider . GetRequiredService < ICSharpHelper > ( ) ,
419467 provider . GetRequiredService < IOptions < HandlebarsScaffoldingOptions > > ( ) ) ;
420- return options == ReverseEngineerOptions . DbContextOnly ||
421- options == ReverseEngineerOptions . DbContextAndEntities
468+ return revEngOptions == ReverseEngineerOptions . DbContextOnly ||
469+ revEngOptions == ReverseEngineerOptions . DbContextAndEntities
422470 ? contextGenerator
423471 : new NullCSharpDbContextGenerator ( ) ;
424472 } )
@@ -430,11 +478,14 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
430478 provider . GetRequiredService < IEntityTypeTemplateService > ( ) ,
431479 provider . GetRequiredService < IEntityTypeTransformationService > ( ) ,
432480 provider . GetRequiredService < IOptions < HandlebarsScaffoldingOptions > > ( ) ) ;
433- return options == ReverseEngineerOptions . EntitiesOnly ||
434- options == ReverseEngineerOptions . DbContextAndEntities
481+ return revEngOptions == ReverseEngineerOptions . EntitiesOnly ||
482+ revEngOptions == ReverseEngineerOptions . DbContextAndEntities
435483 ? entityGenerator
436484 : new NullCSharpEntityTypeGenerator ( ) ;
437- } )
485+ } ) ;
486+ #pragma warning restore EF1001 // Internal EF Core API usage.
487+
488+ services
438489 . AddSingleton < IHbsHelperService > ( provider =>
439490 new HbsHelperService ( new Dictionary < string , Action < TextWriter , Dictionary < string , object > , object [ ] > >
440491 {
@@ -458,6 +509,8 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
458509 . AddSingleton < IEntityTypeTransformationService > ( y => new HbsEntityTypeTransformationService ( entityFileNameTransformer : entityName => $ "{ filenamePrefix } { entityName } ") ) ;
459510 }
460511
512+ services . Configure ( configureOptions ) ;
513+
461514#pragma warning disable EF1001 // Internal EF Core API usage.
462515 new SqlServerDesignTimeServices ( ) . ConfigureDesignTimeServices ( services ) ;
463516#pragma warning restore EF1001 // Internal EF Core API usage.
0 commit comments