private ReverseEngineerResult LaunchExternalRunner(ReverseEngineerOptions options) { var commandOptions = new ReverseEngineerCommandOptions { ConnectionString = options.ConnectionString, ContextClassName = options.ContextClassName, CustomReplacers = options.CustomReplacers, Dacpac = options.Dacpac, DatabaseType = options.DatabaseType, DefaultDacpacSchema = options.DefaultDacpacSchema, DoNotCombineNamespace = options.DoNotCombineNamespace, IdReplace = options.IdReplace, IncludeConnectionString = options.IncludeConnectionString, OutputPath = options.OutputPath, ContextNamespace = options.ContextNamespace, ModelNamespace = options.ModelNamespace, OutputContextPath = options.OutputContextPath, ProjectPath = options.ProjectPath, ProjectRootNamespace = options.ProjectRootNamespace, SelectedHandlebarsLanguage = options.SelectedHandlebarsLanguage, SelectedToBeGenerated = options.SelectedToBeGenerated, Tables = options.Tables, UseDatabaseNames = options.UseDatabaseNames, UseFluentApiOnly = options.UseFluentApiOnly, UseHandleBars = options.UseHandleBars, UseInflector = options.UseInflector, UseLegacyPluralizer = options.UseLegacyPluralizer, UseSpatial = options.UseSpatial, }; var launcher = new EfRevEngLauncher(commandOptions); return(launcher.GetOutput()); }
private void PostProcessContext(string contextFile, ReverseEngineerOptions options, string modelNamespace, string contextNamespace) { var finalLines = new List <string>(); var lines = File.ReadAllLines(contextFile); int i = 1; var inModelCreating = false; foreach (var line in lines) { if (!options.IncludeConnectionString) { if (line.Trim().StartsWith("#warning To protect")) { continue; } if (line.Trim().StartsWith("optionsBuilder.Use")) { continue; } } if (modelNamespace != contextNamespace) { if (line.Contains("using System;")) { finalLines.Add("using " + modelNamespace + ";"); } if (line.Contains("namespace")) { finalLines.Add("namespace " + contextNamespace); continue; } } if (line.Contains("OnModelCreating")) { inModelCreating = true; } if (!options.UseHandleBars && inModelCreating && line.StartsWith(" }")) { finalLines.Add(string.Empty); finalLines.Add(" OnModelCreatingPartial(modelBuilder);"); } if (!options.UseHandleBars && inModelCreating && line.StartsWith(" }")) { finalLines.Add(string.Empty); finalLines.Add(" partial void OnModelCreatingPartial(ModelBuilder modelBuilder);"); } finalLines.Add(line); i++; } File.WriteAllLines(contextFile, finalLines, Encoding.UTF8); }
private void PostProcessContext(string contextFile, ReverseEngineerOptions options) { var finalLines = new List <string>(); var lines = File.ReadAllLines(contextFile); int i = 1; var inModelCreating = false; foreach (var line in lines) { if (!options.IncludeConnectionString) { if (line.Trim().StartsWith("#warning To protect")) { continue; } if (line.Trim().StartsWith("optionsBuilder.Use")) { continue; } } //TODO Get feedback!! if (line.Contains("OnModelCreating")) { inModelCreating = true; } if (inModelCreating && line.StartsWith(" }")) { finalLines.Add(string.Empty); finalLines.Add(" OnModelCreatingPartial(modelBuilder);"); } if (inModelCreating && line.StartsWith(" }")) { finalLines.Add(string.Empty); finalLines.Add(" partial void OnModelCreatingPartial(ModelBuilder modelBuilder);"); } finalLines.Add(line); i++; } File.WriteAllLines(contextFile, finalLines, Encoding.UTF8); }
private void PostProcess(string file, ReverseEngineerOptions options) { var text = File.ReadAllLines(file, Encoding.UTF8); if (options.IdReplace) { for (int i = 0; i < text.Length; ++i) { text[i] = text[i].Replace("Id, ", "ID, "); text[i] = text[i].Replace("Id }", "ID }"); text[i] = text[i].Replace("Id }", "ID }"); text[i] = text[i].Replace("Id)", "ID)"); text[i] = text[i].Replace("Id { get; set; }", "ID { get; set; }"); text[i] = text[i].TrimEnd(); } } text = text.Where(x => !options.IgnoredColumns.Any(s => x.Contains(s))).ToArray(); File.WriteAllLines(file, text, Encoding.UTF8); }
public EfCoreReverseEngineerResult GenerateFiles(ReverseEngineerOptions reverseEngineerOptions) { var errors = new List <string>(); var warnings = new List <string>(); var reporter = new OperationReporter( new OperationReportHandler( m => errors.Add(m), m => warnings.Add(m))); // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); if (reverseEngineerOptions.UseHandleBars) { //TODO Consider being selective based on SelectedToBeGenerated serviceCollection.AddHandlebarsScaffolding(); serviceCollection.AddSingleton <ITemplateFileService>(provider => new CustomTemplateFileService(reverseEngineerOptions.ProjectPath)); } if (reverseEngineerOptions.CustomReplacers != null) { serviceCollection.AddSingleton <ICandidateNamingService>(provider => new ReplacingCandidateNamingService(reverseEngineerOptions.CustomReplacers)); } if (reverseEngineerOptions.UseInflector) { serviceCollection.AddSingleton <IPluralizer, InflectorPluralizer>(); } // Add database provider services switch (reverseEngineerOptions.DatabaseType) { case DatabaseType.SQLCE35: throw new NotImplementedException(); case DatabaseType.SQLCE40: var sqlCeProvider = new SqlCeDesignTimeServices(); sqlCeProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); var spatial = new SqlServerNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); if (!string.IsNullOrEmpty(reverseEngineerOptions.Dacpac)) { serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerDacpacDatabaseModelFactory>(); } break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.Mysql: var mysqlProvider = new MySqlDesignTimeServices(); mysqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } var serviceProvider = serviceCollection.BuildServiceProvider(); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); if (reverseEngineerOptions.DefaultDacpacSchema != null) { schemas.Add(reverseEngineerOptions.DefaultDacpacSchema); } var @namespace = reverseEngineerOptions.ProjectRootNamespace; if (!string.IsNullOrEmpty(reverseEngineerOptions.OutputPath)) { @namespace += "." + reverseEngineerOptions.OutputPath.Replace(Path.DirectorySeparatorChar, '.').Replace(Path.AltDirectorySeparatorChar, '.'); } var modelOptions = new ModelReverseEngineerOptions { UseDatabaseNames = reverseEngineerOptions.UseDatabaseNames }; var codeOptions = new ModelCodeGenerationOptions { UseDataAnnotations = !reverseEngineerOptions.UseFluentApiOnly }; var scaffoldedModel = scaffolder.ScaffoldModel( reverseEngineerOptions.Dacpac != null ? reverseEngineerOptions.Dacpac : reverseEngineerOptions.ConnectionString, reverseEngineerOptions.Tables.Select(m => m.Name).ToArray(), schemas, @namespace, "C#", null, reverseEngineerOptions.ContextClassName, modelOptions, codeOptions); var filePaths = scaffolder.Save( scaffoldedModel, Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath ?? string.Empty), overwriteFiles: true); PostProcessContext(filePaths.ContextFile, reverseEngineerOptions); foreach (var file in filePaths.AdditionalFiles) { PostProcess(file, reverseEngineerOptions.IdReplace); } PostProcess(filePaths.ContextFile, reverseEngineerOptions.IdReplace); var result = new EfCoreReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }
public EfCoreReverseEngineerResult GenerateFiles(ReverseEngineerOptions reverseEngineerOptions) { var errors = new List <string>(); var warnings = new List <string>(); var reporter = new OperationReporter( new OperationReportHandler( m => errors.Add(m), m => warnings.Add(m))); // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); //TODO await update to 2.1 //if (reverseEngineerOptions.UseHandleBars) //{ // serviceCollection.AddHandlebarsScaffolding(reverseEngineerOptions.ProjectPath); //} if (reverseEngineerOptions.UseInflector) { serviceCollection.AddSingleton <IPluralizer, InflectorPluralizer>(); } // Add database provider services switch (reverseEngineerOptions.DatabaseType) { case DatabaseType.SQLCE35: throw new NotImplementedException(); case DatabaseType.SQLCE40: var sqlCeProvider = new SqlCeDesignTimeServices(); sqlCeProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); if (!string.IsNullOrEmpty(reverseEngineerOptions.Dacpac)) { serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerDacpacDatabaseModelFactory>(); } break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); serviceCollection.AddSingleton <IDatabaseModelFactory, CustomSqliteDatabaseModelFactory>(); break; default: throw new ArgumentOutOfRangeException(); } var serviceProvider = serviceCollection.BuildServiceProvider(); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); if (reverseEngineerOptions.DefaultDacpacSchema != null) { schemas.Add(reverseEngineerOptions.DefaultDacpacSchema); } var @namespace = reverseEngineerOptions.ProjectRootNamespace; var subNamespace = SubnamespaceFromOutputPath(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath); if (!string.IsNullOrEmpty(subNamespace)) { @namespace += "." + subNamespace; } var scaffoldedModel = scaffolder.ScaffoldModel( reverseEngineerOptions.Dacpac != null ? reverseEngineerOptions.Dacpac : reverseEngineerOptions.ConnectionString, reverseEngineerOptions.Tables, schemas, @namespace, "C#", null, reverseEngineerOptions.ContextClassName, !reverseEngineerOptions.UseFluentApiOnly, useDatabaseNames: reverseEngineerOptions.UseDatabaseNames); var filePaths = scaffolder.Save( scaffoldedModel, Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath), overwriteFiles: true); foreach (var file in filePaths.AdditionalFiles) { PostProcess(file, reverseEngineerOptions.IdReplace); } PostProcess(filePaths.ContextFile, reverseEngineerOptions.IdReplace); PostProcessContext(filePaths.ContextFile, reverseEngineerOptions); var result = new EfCoreReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }
public EfCoreReverseEngineerResult GenerateFiles(ReverseEngineerOptions reverseEngineerOptions) { var errors = new List <string>(); var warnings = new List <string>(); var reporter = new OperationReporter( new OperationReportHandler( m => errors.Add(m), m => warnings.Add(m))); // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddScaffolding(reporter) .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); if (reverseEngineerOptions.UseHandleBars) { serviceCollection.AddHandlebarsScaffolding(reverseEngineerOptions.ProjectPath); } if (reverseEngineerOptions.UseInflector) { serviceCollection.AddSingleton <IPluralizer, InflectorPluralizer>(); } // Add database provider services switch (reverseEngineerOptions.DatabaseType) { case DatabaseType.SQLCE35: throw new NotImplementedException(); case DatabaseType.SQLCE40: var sqlCeProvider = new SqlCeDesignTimeServices(); sqlCeProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); serviceCollection.AddSingleton <IDatabaseModelFactory, CustomSqliteDatabaseModelFactory>(); break; default: throw new ArgumentOutOfRangeException(); } var serviceProvider = serviceCollection.BuildServiceProvider(); var generator = serviceProvider.GetService <IModelScaffolder>(); var filePaths = generator.Generate( reverseEngineerOptions.ConnectionString, reverseEngineerOptions.Tables, new List <string>(), reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath, reverseEngineerOptions.ProjectRootNamespace, reverseEngineerOptions.ContextClassName, !reverseEngineerOptions.UseFluentApiOnly, overwriteFiles: true, useDatabaseNames: reverseEngineerOptions.UseDatabaseNames); // Explanation: Use table and column names directly from the database. foreach (var file in filePaths.EntityTypeFiles) { PostProcess(file, reverseEngineerOptions.IdReplace); } PostProcess(filePaths.ContextFile, reverseEngineerOptions.IdReplace); if (!reverseEngineerOptions.IncludeConnectionString) { PostProcessContext(filePaths.ContextFile); } var result = new EfCoreReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.EntityTypeFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }
public ReverseEngineerResult GenerateFiles(ReverseEngineerOptions reverseEngineerOptions, bool includeViews) { if (includeViews) { return(LaunchExternalRunner(reverseEngineerOptions)); } var errors = new List <string>(); var warnings = new List <string>(); var reporter = new OperationReporter( new OperationReportHandler( m => errors.Add(m), m => warnings.Add(m))); var serviceProvider = ServiceProviderBuilder.Build(reverseEngineerOptions); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); if (reverseEngineerOptions.DefaultDacpacSchema != null) { schemas.Add(reverseEngineerOptions.DefaultDacpacSchema); } var outputDir = !string.IsNullOrEmpty(reverseEngineerOptions.OutputPath) ? Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath)) : reverseEngineerOptions.ProjectPath; var outputContextDir = !string.IsNullOrEmpty(reverseEngineerOptions.OutputContextPath) ? Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputContextPath)) : outputDir; var modelNamespace = !string.IsNullOrEmpty(reverseEngineerOptions.ModelNamespace) ? reverseEngineerOptions.ProjectRootNamespace + "." + reverseEngineerOptions.ModelNamespace : PathHelper.GetNamespaceFromOutputPath(outputDir, reverseEngineerOptions.ProjectPath, reverseEngineerOptions.ProjectRootNamespace); var contextNamespace = !string.IsNullOrEmpty(reverseEngineerOptions.ContextNamespace) ? reverseEngineerOptions.ProjectRootNamespace + "." + reverseEngineerOptions.ContextNamespace : PathHelper.GetNamespaceFromOutputPath(outputContextDir, reverseEngineerOptions.ProjectPath, reverseEngineerOptions.ProjectRootNamespace); var modelOptions = new ModelReverseEngineerOptions { UseDatabaseNames = reverseEngineerOptions.UseDatabaseNames }; var codeOptions = new ModelCodeGenerationOptions { UseDataAnnotations = !reverseEngineerOptions.UseFluentApiOnly }; var scaffoldedModel = scaffolder.ScaffoldModel( reverseEngineerOptions.Dacpac != null ? reverseEngineerOptions.Dacpac : reverseEngineerOptions.ConnectionString, reverseEngineerOptions.Tables.Select(m => m.Name).ToArray(), schemas, modelNamespace, "C#", outputContextDir, reverseEngineerOptions.ContextClassName, modelOptions, codeOptions); var filePaths = scaffolder.Save( scaffoldedModel, outputDir, overwriteFiles: true); PostProcessContext(filePaths.ContextFile, reverseEngineerOptions, modelNamespace, contextNamespace); foreach (var file in filePaths.AdditionalFiles) { PostProcess(file, reverseEngineerOptions.IdReplace); } PostProcess(filePaths.ContextFile, reverseEngineerOptions.IdReplace); CleanUp(filePaths); var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }
public static ServiceProvider Build(ReverseEngineerOptions options) { // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); if (options.UseHandleBars) { //TODO Consider being selective based on SelectedToBeGenerated var selected = Microsoft.EntityFrameworkCore.Design.ReverseEngineerOptions.DbContextAndEntities; var language = (LanguageOptions)options.SelectedHandlebarsLanguage; serviceCollection.AddHandlebarsScaffolding(selected, language); serviceCollection.AddSingleton <ITemplateFileService>(provider => new CustomTemplateFileService(options.ProjectPath)); } if (options.CustomReplacers != null) { serviceCollection.AddSingleton <ICandidateNamingService>(provider => new ReplacingCandidateNamingService(options.CustomReplacers)); } if (options.UseInflector) { if (options.UseLegacyPluralizer) { serviceCollection.AddSingleton <IPluralizer, LegacyPluralizer>(); } else { serviceCollection.AddSingleton <IPluralizer, HumanizerPluralizer>(); } } // Add database provider services switch (options.DatabaseType) { case DatabaseType.SQLCE35: throw new NotImplementedException(); case DatabaseType.SQLCE40: var sqlCeProvider = new SqlCeDesignTimeServices(); sqlCeProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); if (!string.IsNullOrEmpty(options.Dacpac)) { serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerDacpacDatabaseModelFactory>(); } if (options.UseSpatial) { var spatial = new SqlServerNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.Mysql: var mysqlProvider = new MySqlDesignTimeServices(); mysqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } return(serviceCollection.BuildServiceProvider()); }
public EfCoreReverseEngineerResult GenerateFiles(ReverseEngineerOptions reverseEngineerOptions) { var errors = new List <string>(); var warnings = new List <string>(); var reporter = new OperationReporter( new OperationReportHandler( m => errors.Add(m), m => warnings.Add(m))); var serviceProvider = ServiceProviderBuilder.Build(reverseEngineerOptions); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); if (reverseEngineerOptions.DefaultDacpacSchema != null) { schemas.Add(reverseEngineerOptions.DefaultDacpacSchema); } var @namespace = reverseEngineerOptions.ProjectRootNamespace; if (!string.IsNullOrEmpty(reverseEngineerOptions.OutputPath) && !reverseEngineerOptions.DoNotCombineNamespace) { @namespace += "." + reverseEngineerOptions.OutputPath.Replace(Path.DirectorySeparatorChar, '.').Replace(Path.AltDirectorySeparatorChar, '.'); } var modelOptions = new ModelReverseEngineerOptions { UseDatabaseNames = reverseEngineerOptions.UseDatabaseNames }; var codeOptions = new ModelCodeGenerationOptions { UseDataAnnotations = !reverseEngineerOptions.UseFluentApiOnly }; var scaffoldedModel = scaffolder.ScaffoldModel( reverseEngineerOptions.Dacpac != null ? reverseEngineerOptions.Dacpac : reverseEngineerOptions.ConnectionString, reverseEngineerOptions.Tables.Select(m => m.Name).ToArray(), schemas, @namespace, "C#", null, reverseEngineerOptions.ContextClassName, modelOptions, codeOptions); var filePaths = scaffolder.Save( scaffoldedModel, Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath ?? string.Empty), overwriteFiles: true); PostProcessContext(filePaths.ContextFile, reverseEngineerOptions); foreach (var file in filePaths.AdditionalFiles) { PostProcess(file, reverseEngineerOptions.IdReplace); } PostProcess(filePaths.ContextFile, reverseEngineerOptions.IdReplace); var result = new EfCoreReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }