public static ReverseEngineerResult GenerateFiles(ReverseEngineerCommandOptions 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); } if (reverseEngineerOptions.FilterSchemas) { schemas.AddRange(reverseEngineerOptions.Schemas.Select(s => s.Name)); } var outputDir = !string.IsNullOrEmpty(reverseEngineerOptions.OutputPath) ? Path.IsPathFullyQualified(reverseEngineerOptions.OutputPath) ? reverseEngineerOptions.OutputPath : Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath)) : reverseEngineerOptions.ProjectPath; var outputContextDir = !string.IsNullOrEmpty(reverseEngineerOptions.OutputContextPath) ? Path.IsPathFullyQualified(reverseEngineerOptions.OutputContextPath) ? 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); SavedModelFiles procedurePaths = null; var procedureModelScaffolder = serviceProvider.GetService <IProcedureScaffolder>(); if (procedureModelScaffolder != null && reverseEngineerOptions.Tables.Any(t => t.ObjectType == ObjectType.Procedure)) { var procedureModelFactory = serviceProvider.GetService <IProcedureModelFactory>(); var procedureModelFactoryOptions = new ProcedureModelFactoryOptions { FullModel = true, Procedures = reverseEngineerOptions.Tables.Where(t => t.ObjectType == ObjectType.Procedure).Select(m => m.Name), }; var procedureModel = procedureModelFactory.Create(reverseEngineerOptions.Dacpac ?? reverseEngineerOptions.ConnectionString, procedureModelFactoryOptions); var procedureOptions = new ProcedureScaffolderOptions { ContextDir = outputContextDir, ContextName = reverseEngineerOptions.ContextClassName, ContextNamespace = contextNamespace, ModelNamespace = modelNamespace, NullableReferences = reverseEngineerOptions.UseNullableReferences, }; var procedureScaffoldedModel = procedureModelScaffolder.ScaffoldModel(procedureModel, procedureOptions, ref errors); if (procedureScaffoldedModel != null) { procedurePaths = procedureModelScaffolder.Save( procedureScaffoldedModel, Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath ?? string.Empty)), contextNamespace); } } var modelOptions = new ModelReverseEngineerOptions { UseDatabaseNames = reverseEngineerOptions.UseDatabaseNames, #if CORE50 NoPluralize = !reverseEngineerOptions.UseInflector, #endif }; var codeOptions = new ModelCodeGenerationOptions { UseDataAnnotations = !reverseEngineerOptions.UseFluentApiOnly, Language = "C#", ContextName = reverseEngineerOptions.ContextClassName, ContextDir = outputContextDir, RootNamespace = null, ContextNamespace = contextNamespace, ModelNamespace = modelNamespace, SuppressConnectionStringWarning = false, ConnectionString = reverseEngineerOptions.ConnectionString, #if CORE50 SuppressOnConfiguring = !reverseEngineerOptions.IncludeConnectionString, #endif }; var dbOptions = new DatabaseModelFactoryOptions(reverseEngineerOptions.Tables.Where(t => t.ObjectType.HasColumns()).Select(m => m.Name), schemas); var scaffoldedModel = ScaffoldModel( reverseEngineerOptions.Dacpac ?? reverseEngineerOptions.ConnectionString, dbOptions, modelOptions, codeOptions, reverseEngineerOptions.UseBoolPropertiesWithoutDefaultSql, serviceProvider); var filePaths = scaffolder.Save( scaffoldedModel, Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath ?? string.Empty)), overwriteFiles: true); #if CORE50 #else RemoveOnConfiguring(filePaths.ContextFile, reverseEngineerOptions.IncludeConnectionString); #endif foreach (var file in filePaths.AdditionalFiles) { PostProcess(file); } PostProcess(filePaths.ContextFile); var entityTypeConfigurationPaths = SplitDbContext(filePaths.ContextFile, reverseEngineerOptions.UseDbContextSplitting, contextNamespace); var cleanUpPaths = new SavedModelFiles(filePaths.ContextFile, filePaths.AdditionalFiles); if (procedurePaths != null) { cleanUpPaths.AdditionalFiles.Add(procedurePaths.ContextFile); foreach (var additionalFile in procedurePaths.AdditionalFiles) { cleanUpPaths.AdditionalFiles.Add(additionalFile); } } CleanUp(cleanUpPaths, entityTypeConfigurationPaths); var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, ContextConfigurationFilePaths = entityTypeConfigurationPaths, }; return(result); }
public EfRevEngLauncher(ReverseEngineerCommandOptions options) { this.options = options; }
public static ServiceProvider Build(ReverseEngineerCommandOptions options) { // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() #if CORE50 .AddSingleton <ICSharpEntityTypeGenerator>(provider => new CommentCSharpEntityTypeGenerator( provider.GetService <IAnnotationCodeGenerator>(), provider.GetService <ICSharpHelper>(), options.UseNullableReferences, options.UseNoConstructor)) #else .AddSingleton <ICSharpEntityTypeGenerator>(provider => new CommentCSharpEntityTypeGenerator( provider.GetService <ICSharpHelper>(), options.UseNullableReferences, options.UseNoConstructor)) #endif .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>() .AddSingleton <IScaffoldingModelFactory>(provider => new ColumnRemovingScaffoldingModelFactory( provider.GetService <IOperationReporter>(), provider.GetService <ICandidateNamingService>(), provider.GetService <IPluralizer>(), provider.GetService <ICSharpUtilities>(), provider.GetService <IScaffoldingTypeMapper>(), provider.GetService <LoggingDefinitions>(), options.Tables, options.DatabaseType )); if (options.CustomReplacers != null) { serviceCollection.AddSingleton <ICandidateNamingService>(provider => new ReplacingCandidateNamingService(options.CustomReplacers)); } if (options.UseHandleBars) { serviceCollection.AddHandlebarsScaffolding(hbOptions => { hbOptions.ReverseEngineerOptions = ReverseEngineerOptions.DbContextAndEntities; hbOptions.LanguageOptions = (LanguageOptions)options.SelectedHandlebarsLanguage; }); serviceCollection.AddSingleton <ITemplateFileService>(provider => new CustomTemplateFileService(options.ProjectPath)); } if (options.UseInflector || options.UseLegacyPluralizer) { if (options.UseLegacyPluralizer) { serviceCollection.AddSingleton <IPluralizer, LegacyPluralizer>(); } #if CORE50 #else else { serviceCollection.AddSingleton <IPluralizer, HumanizerPluralizer>(); } #endif } // Add database provider services switch (options.DatabaseType) { case DatabaseType.Edmx: var edmxProvider = new SqlServerDesignTimeServices(); edmxProvider.ConfigureDesignTimeServices(serviceCollection); serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerEdmxDatabaseModelFactory>(); break; case DatabaseType.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); serviceCollection.AddSqlServerStoredProcedureDesignTimeServices(); serviceCollection.AddSqlServerFunctionDesignTimeServices(); if (options.UseSpatial) { var spatial = new SqlServerNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.SQLServerDacpac: var dacProvider = new SqlServerDesignTimeServices(); dacProvider.ConfigureDesignTimeServices(serviceCollection); serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerDacpacDatabaseModelFactory>(); serviceCollection.AddSqlServerDacpacStoredProcedureDesignTimeServices(); if (options.UseSpatial) { var spatial = new SqlServerNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); if (options.UseNodaTime) { var nodaTime = new NpgsqlNodaTimeDesignTimeServices(); nodaTime.ConfigureDesignTimeServices(serviceCollection); } if (options.UseSpatial) { var spatial = new NpgsqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Mysql: var mysqlProvider = new MySqlDesignTimeServices(); mysqlProvider.ConfigureDesignTimeServices(serviceCollection); if (options.UseSpatial) { var spatial = new MySqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Oracle: var oracleProvider = new OracleDesignTimeServices(); oracleProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } return(serviceCollection.BuildServiceProvider()); }
public static ServiceProvider Build(ReverseEngineerCommandOptions options) { // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <ICSharpEntityTypeGenerator, CommentCSharpEntityTypeGenerator>() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); if (options.UseHandleBars) { //TODO Consider being selective based on SelectedToBeGenerated var selected = 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.SQLServer: var provider = new SqlServerDesignTimeServices(); provider.ConfigureDesignTimeServices(serviceCollection); if (!string.IsNullOrEmpty(options.Dacpac)) { serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerDacpacDatabaseModelFactory>(); } else { serviceCollection.AddSingleton <IDatabaseModelFactory, SqlServerFasterDatabaseModelFactory>(); } if (options.UseSpatial) { var spatial = new SqlServerNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } if (string.IsNullOrEmpty(options.Dacpac) && options.UseStoredProcedures) { serviceCollection.AddSqlServerStoredProcedureDesignTimeServices(); } break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); if (options.UseNodaTime) { var nodaTime = new NpgsqlNodaTimeDesignTimeServices(); nodaTime.ConfigureDesignTimeServices(serviceCollection); } if (options.UseSpatial) { var spatial = new NpgsqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Mysql: var mysqlProvider = new MySqlDesignTimeServices(); mysqlProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.Oracle: var oracleProvider = new OracleDesignTimeServices(); oracleProvider.ConfigureDesignTimeServices(serviceCollection); break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } return(serviceCollection.BuildServiceProvider()); }
public ReverseEngineerResult GenerateFiles(ReverseEngineerCommandOptions 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.IsPathFullyQualified(reverseEngineerOptions.OutputPath) ? reverseEngineerOptions.OutputPath : Path.GetFullPath(Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath)) : reverseEngineerOptions.ProjectPath; var outputContextDir = !string.IsNullOrEmpty(reverseEngineerOptions.OutputContextPath) ? Path.IsPathFullyQualified(reverseEngineerOptions.OutputContextPath) ? 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, Language = "C#", ContextName = reverseEngineerOptions.ContextClassName, ContextDir = outputContextDir, RootNamespace = null, ContextNamespace = contextNamespace, ModelNamespace = modelNamespace, SuppressConnectionStringWarning = false, ConnectionString = reverseEngineerOptions.ConnectionString, }; var dbOptions = new DatabaseModelFactoryOptions(reverseEngineerOptions.Tables.Select(m => m.Name), schemas); var scaffoldedModel = scaffolder.ScaffoldModel( reverseEngineerOptions.Dacpac ?? reverseEngineerOptions.ConnectionString, dbOptions, modelOptions, codeOptions); var filePaths = scaffolder.Save( scaffoldedModel, Path.Combine(reverseEngineerOptions.ProjectPath, reverseEngineerOptions.OutputPath ?? string.Empty), overwriteFiles: true); string fixedNamespace = modelNamespace != contextNamespace ? modelNamespace : null; PostProcessContext(filePaths.ContextFile, reverseEngineerOptions, fixedNamespace); foreach (var file in filePaths.AdditionalFiles) { PostProcess(file); } PostProcess(filePaths.ContextFile); CleanUp(filePaths); var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, }; return(result); }
public static ReverseEngineerResult GenerateFiles(ReverseEngineerCommandOptions options) { 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(options); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); options.ConnectionString = SqlServerHelper.SetConnectionString(options.DatabaseType, options.ConnectionString); if (options.DefaultDacpacSchema != null) { schemas.Add(options.DefaultDacpacSchema); } if (options.FilterSchemas) { schemas.AddRange(options.Schemas.Select(s => s.Name)); } if (options.UseNoObjectFilter) { options.Tables = new List <SerializationTableModel>(); } #if CORE60 #else foreach (var table in options.Tables) { table.Name = table.Name.Replace("'", "''"); } #endif var outputDir = !string.IsNullOrEmpty(options.OutputPath) ? Path.IsPathFullyQualified(options.OutputPath) ? options.OutputPath : Path.GetFullPath(Path.Combine(options.ProjectPath, options.OutputPath)) : options.ProjectPath; var outputContextDir = !string.IsNullOrEmpty(options.OutputContextPath) ? Path.IsPathFullyQualified(options.OutputContextPath) ? options.OutputContextPath : Path.GetFullPath(Path.Combine(options.ProjectPath, options.OutputContextPath)) : outputDir; var modelNamespace = string.Empty; var contextNamespace = string.Empty; if (string.IsNullOrEmpty(options.ProjectRootNamespace)) { modelNamespace = !string.IsNullOrEmpty(options.ModelNamespace) ? options.ModelNamespace : PathHelper.GetNamespaceFromOutputPath(outputDir, options.ProjectPath, options.ProjectRootNamespace); contextNamespace = !string.IsNullOrEmpty(options.ContextNamespace) ? options.ContextNamespace : PathHelper.GetNamespaceFromOutputPath(outputContextDir, options.ProjectPath, options.ProjectRootNamespace); } else { modelNamespace = !string.IsNullOrEmpty(options.ModelNamespace) ? options.ProjectRootNamespace + "." + options.ModelNamespace : PathHelper.GetNamespaceFromOutputPath(outputDir, options.ProjectPath, options.ProjectRootNamespace); contextNamespace = !string.IsNullOrEmpty(options.ContextNamespace) ? options.ProjectRootNamespace + "." + options.ContextNamespace : PathHelper.GetNamespaceFromOutputPath(outputContextDir, options.ProjectPath, options.ProjectRootNamespace); } var entityTypeConfigurationPaths = new List <string>(); SavedModelFiles procedurePaths = null; SavedModelFiles functionPaths = null; SavedModelFiles filePaths = ReverseEngineerScaffolder.GenerateDbContext(options, serviceProvider, schemas, outputContextDir, modelNamespace, contextNamespace); if (options.SelectedToBeGenerated != 2) { procedurePaths = ReverseEngineerScaffolder.GenerateStoredProcedures(options, ref errors, serviceProvider, outputContextDir, modelNamespace, contextNamespace); functionPaths = ReverseEngineerScaffolder.GenerateFunctions(options, ref errors, serviceProvider, outputContextDir, modelNamespace, contextNamespace); #if CORE50 || CORE60 if (functionPaths != null) { var dbContextLines = File.ReadAllLines(filePaths.ContextFile).ToList(); var index = dbContextLines.IndexOf(" OnModelCreatingPartial(modelBuilder);"); if (index != -1) { dbContextLines.Insert(index, " OnModelCreatingGeneratedFunctions(modelBuilder);"); File.WriteAllLines(filePaths.ContextFile, dbContextLines); } } #endif RemoveFragments(filePaths.ContextFile, options.ContextClassName, options.IncludeConnectionString, options.UseNoDefaultConstructor); if (!options.UseHandleBars) { PostProcess(filePaths.ContextFile, options.UseNullableReferences); } entityTypeConfigurationPaths = SplitDbContext(filePaths.ContextFile, options.UseDbContextSplitting, contextNamespace, options.UseNullableReferences); } else if (options.SelectedToBeGenerated == 2 && (options.Tables.Count(t => t.ObjectType == ObjectType.Procedure) > 0 || options.Tables.Count(t => t.ObjectType == ObjectType.ScalarFunction) > 0)) { warnings.Add("Selected stored procedures/scalar functions will not be generated, as 'Entity Types only' was selected"); } if (!options.UseHandleBars) { foreach (var file in filePaths.AdditionalFiles) { PostProcess(file, options.UseNullableReferences); } } if (options.RunCleanup) { var cleanUpPaths = CreateCleanupPaths(procedurePaths, functionPaths, filePaths); CleanUp(cleanUpPaths, entityTypeConfigurationPaths, outputDir); } var allfiles = filePaths.AdditionalFiles.ToList(); if (procedurePaths != null) { allfiles.AddRange(procedurePaths.AdditionalFiles); allfiles.Add(procedurePaths.ContextFile); } if (functionPaths != null) { allfiles.AddRange(functionPaths.AdditionalFiles); allfiles.Add(functionPaths.ContextFile); } var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = allfiles, ContextFilePath = filePaths.ContextFile, ContextConfigurationFilePaths = entityTypeConfigurationPaths, }; return(result); }
public static ServiceProvider Build(ReverseEngineerCommandOptions options) { // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <ICSharpEntityTypeGenerator, CommentCSharpEntityTypeGenerator>() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>(); 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.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); if (options.UseNodaTime) { var nodaTime = new NpgsqlNodaTimeDesignTimeServices(); nodaTime.ConfigureDesignTimeServices(serviceCollection); } if (options.UseSpatial) { var spatial = new NpgsqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } return(serviceCollection.BuildServiceProvider()); }
public EfRevEngLauncher(ReverseEngineerCommandOptions options, bool useEFCore5) { this.options = options; this.useEFCore5 = useEFCore5; resultDeserializer = new ResultDeserializer(); }
public static ServiceProvider Build(ReverseEngineerCommandOptions options) { // Add base services for scaffolding var serviceCollection = new ServiceCollection(); serviceCollection .AddEntityFrameworkDesignTimeServices() .AddSingleton <ICSharpEntityTypeGenerator, CommentCSharpEntityTypeGenerator>() .AddSingleton <IOperationReporter, OperationReporter>() .AddSingleton <IOperationReportHandler, OperationReportHandler>() .AddSingleton <IScaffoldingModelFactory>(provider => new ColumnRemovingScaffoldingModelFactory( provider.GetService <IOperationReporter>(), provider.GetService <ICandidateNamingService>(), provider.GetService <IPluralizer>(), provider.GetService <ICSharpUtilities>(), provider.GetService <IScaffoldingTypeMapper>(), provider.GetService <LoggingDefinitions>(), options.Tables, options.DatabaseType )); if (options.CustomReplacers != null) { serviceCollection.AddSingleton <ICandidateNamingService>(provider => new ReplacingCandidateNamingService(options.CustomReplacers)); } if (options.UseHandleBars) { //TODO Consider being selective based on SelectedToBeGenerated serviceCollection.AddHandlebarsScaffolding(hbOptions => { hbOptions.ReverseEngineerOptions = ReverseEngineerOptions.DbContextAndEntities; hbOptions.LanguageOptions = (LanguageOptions)options.SelectedHandlebarsLanguage; }); serviceCollection.AddSingleton <ITemplateFileService>(provider => new CustomTemplateFileService(options.ProjectPath)); } if (options.UseLegacyPluralizer) { serviceCollection.AddSingleton <IPluralizer, LegacyPluralizer>(); } // Add database provider services switch (options.DatabaseType) { 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); } if (string.IsNullOrEmpty(options.Dacpac)) { serviceCollection.AddSqlServerStoredProcedureDesignTimeServices(); } var builder = new SqlConnectionStringBuilder(options.ConnectionString) { CommandTimeout = 300 }; options.ConnectionString = builder.ConnectionString; break; case DatabaseType.Npgsql: var npgsqlProvider = new NpgsqlDesignTimeServices(); npgsqlProvider.ConfigureDesignTimeServices(serviceCollection); if (options.UseNodaTime) { var nodaTime = new NpgsqlNodaTimeDesignTimeServices(); nodaTime.ConfigureDesignTimeServices(serviceCollection); } if (options.UseSpatial) { var spatial = new NpgsqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.Mysql: var mysqlProvider = new MySqlDesignTimeServices(); mysqlProvider.ConfigureDesignTimeServices(serviceCollection); if (options.UseSpatial) { var spatial = new MySqlNetTopologySuiteDesignTimeServices(); spatial.ConfigureDesignTimeServices(serviceCollection); } break; case DatabaseType.SQLite: var sqliteProvider = new SqliteDesignTimeServices(); sqliteProvider.ConfigureDesignTimeServices(serviceCollection); break; default: throw new ArgumentOutOfRangeException(); } return(serviceCollection.BuildServiceProvider()); }
public static ReverseEngineerResult GenerateFiles(ReverseEngineerCommandOptions options) { 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(options); var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); var schemas = new List <string>(); options.ConnectionString = SqlServerHelper.SetConnectionString(options.DatabaseType, options.ConnectionString); if (options.DefaultDacpacSchema != null) { schemas.Add(options.DefaultDacpacSchema); } if (options.FilterSchemas) { schemas.AddRange(options.Schemas.Select(s => s.Name)); } if (options.UseNoObjectFilter) { options.Tables = new List <SerializationTableModel>(); } var outputDir = !string.IsNullOrEmpty(options.OutputPath) ? Path.IsPathFullyQualified(options.OutputPath) ? options.OutputPath : Path.GetFullPath(Path.Combine(options.ProjectPath, options.OutputPath)) : options.ProjectPath; var outputContextDir = !string.IsNullOrEmpty(options.OutputContextPath) ? Path.IsPathFullyQualified(options.OutputContextPath) ? options.OutputContextPath : Path.GetFullPath(Path.Combine(options.ProjectPath, options.OutputContextPath)) : outputDir; var modelNamespace = string.Empty; var contextNamespace = string.Empty; if (string.IsNullOrEmpty(options.ProjectRootNamespace)) { modelNamespace = !string.IsNullOrEmpty(options.ModelNamespace) ? options.ModelNamespace : PathHelper.GetNamespaceFromOutputPath(outputDir, options.ProjectPath, options.ProjectRootNamespace); contextNamespace = !string.IsNullOrEmpty(options.ContextNamespace) ? options.ContextNamespace : PathHelper.GetNamespaceFromOutputPath(outputContextDir, options.ProjectPath, options.ProjectRootNamespace); } else { modelNamespace = !string.IsNullOrEmpty(options.ModelNamespace) ? options.ProjectRootNamespace + "." + options.ModelNamespace : PathHelper.GetNamespaceFromOutputPath(outputDir, options.ProjectPath, options.ProjectRootNamespace); contextNamespace = !string.IsNullOrEmpty(options.ContextNamespace) ? options.ProjectRootNamespace + "." + options.ContextNamespace : PathHelper.GetNamespaceFromOutputPath(outputContextDir, options.ProjectPath, options.ProjectRootNamespace); } var entityTypeConfigurationPaths = new List <string>(); SavedModelFiles procedurePaths = null; SavedModelFiles functionPaths = null; SavedModelFiles filePaths = ReverseEngineerScaffolder.GenerateDbContext(options, serviceProvider, schemas, outputContextDir, modelNamespace, contextNamespace); if (options.SelectedToBeGenerated != 2) { procedurePaths = ReverseEngineerScaffolder.GenerateStoredProcedures(options, ref errors, serviceProvider, outputContextDir, modelNamespace, contextNamespace); functionPaths = ReverseEngineerScaffolder.GenerateFunctions(options, ref errors, serviceProvider, outputContextDir, modelNamespace, contextNamespace); #if CORE50 #else RemoveOnConfiguring(filePaths.ContextFile, options.IncludeConnectionString); #endif PostProcess(filePaths.ContextFile); entityTypeConfigurationPaths = SplitDbContext(filePaths.ContextFile, options.UseDbContextSplitting, contextNamespace, options.UseNullableReferences); } foreach (var file in filePaths.AdditionalFiles) { PostProcess(file); } var cleanUpPaths = CreateCleanupPaths(procedurePaths, functionPaths, filePaths); CleanUp(cleanUpPaths, entityTypeConfigurationPaths); var allfiles = filePaths.AdditionalFiles.ToList(); if (procedurePaths != null) { allfiles.AddRange(procedurePaths.AdditionalFiles); allfiles.Add(procedurePaths.ContextFile); } if (functionPaths != null) { allfiles.AddRange(functionPaths.AdditionalFiles); allfiles.Add(functionPaths.ContextFile); } var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = allfiles, ContextFilePath = filePaths.ContextFile, ContextConfigurationFilePaths = entityTypeConfigurationPaths, }; return(result); }
public SavedModelFiles GenerateStoredProcedures( ReverseEngineerCommandOptions options, ref List <string> errors, string outputContextDir, string modelNamespace, string contextNamespace, bool supportsProcedures) { if (options == null) { throw new ArgumentNullException(nameof(options)); } var procedureModelScaffolder = procedureModelFactory; if (procedureModelScaffolder != null && supportsProcedures && (options.Tables.Any(t => t.ObjectType == ObjectType.Procedure) || !options.Tables.Any())) { var procedureModelFactoryOptions = new ModuleModelFactoryOptions { DiscoverMultipleResultSets = options.UseMultipleSprocResultSets, UseLegacyResultSetDiscovery = options.UseLegacyResultSetDiscovery && !options.UseMultipleSprocResultSets, FullModel = true, Modules = options.Tables.Where(t => t.ObjectType == ObjectType.Procedure).Select(m => m.Name), ModulesUsingLegacyDiscovery = options.Tables .Where(t => t.ObjectType == ObjectType.Procedure && t.UseLegacyResultSetDiscovery) .Select(m => m.Name), MappedModules = options.Tables .Where(t => t.ObjectType == ObjectType.Procedure && !string.IsNullOrEmpty(t.MappedType)) .Select(m => new { m.Name, m.MappedType }) .ToDictionary(m => m.Name, m => m.MappedType), }; var procedureModel = procedureModelFactory.Create(options.Dacpac ?? options.ConnectionString, procedureModelFactoryOptions); ApplyRenamers(procedureModel.Routines, options.CustomReplacers); var procedureOptions = new ModuleScaffolderOptions { ContextDir = outputContextDir, ContextName = options.ContextClassName, ContextNamespace = contextNamespace, ModelNamespace = modelNamespace, NullableReferences = options.UseNullableReferences, UseSchemaFolders = options.UseSchemaFolders, UseAsyncCalls = options.UseAsyncCalls, }; var procedureScaffoldedModel = procedureScaffolder.ScaffoldModel(procedureModel, procedureOptions, ref errors); if (procedureScaffoldedModel != null) { return(procedureScaffolder.Save( procedureScaffoldedModel, Path.GetFullPath(Path.Combine(options.ProjectPath, options.OutputPath ?? string.Empty)), contextNamespace, options.UseAsyncCalls)); } } return(null); }