TrackableEntities / EntityFrameworkCore.Scaffolding.Handlebars

Scaffold EF Core models using Handlebars templates.
MIT License
208 stars 53 forks source link

Runtime error with Turkish culture #104

Closed ErikEJ closed 4 years ago

ErikEJ commented 4 years ago

see https://github.com/ErikEJ/EFCorePowerTools/issues/366

ErikEJ commented 4 years ago

Test (brittle, do not commit);

        [Theory]
        [InlineData(false, "en-US")]
        [InlineData(true, "en-US")]
        [InlineData(false, "tr-TR")]
        [InlineData(true, "tr-TR")]
        public void WriteCode_Should_Generate_Context_File(bool useDataAnnotations, string culture)
        {
            // Arrange
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
            var options = ReverseEngineerOptions.DbContextOnly;
            var scaffolder = CreateScaffolder(options);

            // Act
            var model = scaffolder.ScaffoldModel(
                connectionString: Constants.Connections.SqlServerConnection,
                databaseOptions: new DatabaseModelFactoryOptions(),
                modelOptions: new ModelReverseEngineerOptions(),
                codeOptions: new ModelCodeGenerationOptions
                {
                    ContextNamespace = Constants.Parameters.RootNamespace,
                    ModelNamespace = Constants.Parameters.RootNamespace,
                    ContextName = Constants.Parameters.ContextName,
                    ContextDir = Constants.Parameters.ProjectPath,
                    UseDataAnnotations = useDataAnnotations,
                    Language = "C#",
                });

            // Assert
            var files = GetGeneratedFiles(model, options);
            object expectedContext = useDataAnnotations
                ? ExpectedContextsWithAnnotations.ContextClass
                : ExpectedContexts.ContextClass;

            var context = files[Constants.Files.CSharpFiles.DbContextFile];

            Assert.Equal(expectedContext, context);
        }

Fix:


        protected override IDictionary<string, string> GetPartialTemplates(
            LanguageOptions language = LanguageOptions.CSharp)
        {
            DbContextTemplateFiles.TryGetValue(Constants.DbContextImportTemplate, out TemplateFileInfo importFile);
            var importTemplateFile = FileService.RetrieveTemplateFileContents(
                importFile.RelativeDirectory, importFile.FileName);

            DbContextTemplateFiles.TryGetValue(Constants.DbContextCtorTemplate, out TemplateFileInfo ctorFile);
            var ctorTemplateFile = FileService.RetrieveTemplateFileContents(
                ctorFile.RelativeDirectory, ctorFile.FileName);

            DbContextTemplateFiles.TryGetValue(Constants.DbContextDbSetsTemplate, out TemplateFileInfo propertyFile);
            var propertyTemplateFile = FileService.RetrieveTemplateFileContents(
                propertyFile.RelativeDirectory, propertyFile.FileName);

            var templates = new Dictionary<string, string>
            {
                {
                    Constants.DbContextImportTemplate.ToLower(CultureInfo.InvariantCulture),
                    importTemplateFile
                },
                {
                    Constants.DbContextCtorTemplate.ToLower(CultureInfo.InvariantCulture),
                    ctorTemplateFile
                },
                {
                    Constants.DbContextDbSetsTemplate.ToLower(CultureInfo.InvariantCulture),
                    propertyTemplateFile
                },
            };
            return templates;
        }
ErikEJ commented 4 years ago

@tonysneed Any plans for a fix?

tonysneed commented 4 years ago

Fixed! :)

ErikEJ commented 4 years ago

Great, thanks! will you mention me when an updated Nuget package is published?

tonysneed commented 4 years ago

@ErikEJ Yes I will! Going to merge some PR’a and release a new version to NuGet this weekend.

tonysneed commented 4 years ago

@ErikEJ Published v3.7.0 of the NuGet package. Here are the release notes.