public TableListBuilder(int databaseType, string connectionString, SchemaInfo[] schemas) { if (string.IsNullOrEmpty(connectionString)) { throw new ArgumentNullException(@"invalid connection string", nameof(connectionString)); } _connectionString = SqlServerHelper.SetConnectionString((DatabaseType)databaseType, connectionString); _schemas = schemas; _databaseType = (DatabaseType)databaseType; var options = new ReverseEngineerCommandOptions { DatabaseType = _databaseType, }; _serviceProvider = ServiceProviderBuilder.Build(options); }
public TableListBuilder(int databaseType, string connectionString, SchemaInfo[] schemas, bool mergeDacpacs) { if (string.IsNullOrEmpty(connectionString)) { throw new ArgumentNullException(nameof(connectionString), @"invalid connection string"); } this.connectionString = SqlServerHelper.SetConnectionString((DatabaseType)databaseType, connectionString); this.schemas = schemas; this.databaseType = (DatabaseType)databaseType; var options = new ReverseEngineerCommandOptions { DatabaseType = this.databaseType, MergeDacpacs = mergeDacpacs, }; serviceProvider = ServiceProviderBuilder.Build(options); }
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); } 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"); } 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 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>(); reverseEngineerOptions.ConnectionString = SqlServerHelper.SetConnectionString(reverseEngineerOptions.DatabaseType, reverseEngineerOptions.ConnectionString); 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 ModuleModelFactoryOptions { FullModel = true, Modules = reverseEngineerOptions.Tables.Where(t => t.ObjectType == ObjectType.Procedure).Select(m => m.Name), }; var procedureModel = procedureModelFactory.Create(reverseEngineerOptions.Dacpac ?? reverseEngineerOptions.ConnectionString, procedureModelFactoryOptions); var procedureOptions = new ModuleScaffolderOptions { 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); } } SavedModelFiles functionPaths = null; var functionModelScaffolder = serviceProvider.GetService <IFunctionScaffolder>(); if (functionModelScaffolder != null && reverseEngineerOptions.Tables.Any(t => t.ObjectType == ObjectType.ScalarFunction)) { var functionModelFactory = serviceProvider.GetService <IFunctionModelFactory>(); var modelFactoryOptions = new ModuleModelFactoryOptions { FullModel = true, Modules = reverseEngineerOptions.Tables.Where(t => t.ObjectType == ObjectType.ScalarFunction).Select(m => m.Name), }; var functionModel = functionModelFactory.Create(reverseEngineerOptions.Dacpac ?? reverseEngineerOptions.ConnectionString, modelFactoryOptions); var functionOptions = new ModuleScaffolderOptions { ContextDir = outputContextDir, ContextName = reverseEngineerOptions.ContextClassName, ContextNamespace = contextNamespace, ModelNamespace = modelNamespace, NullableReferences = reverseEngineerOptions.UseNullableReferences, }; var functionScaffoldedModel = functionModelScaffolder.ScaffoldModel(functionModel, functionOptions, ref errors); if (functionScaffoldedModel != null) { functionPaths = functionModelScaffolder.Save( functionScaffoldedModel, 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, reverseEngineerOptions.UseNoNavigations, 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); } } if (functionPaths != null) { cleanUpPaths.AdditionalFiles.Add(functionPaths.ContextFile); } CleanUp(cleanUpPaths, entityTypeConfigurationPaths); var result = new ReverseEngineerResult { EntityErrors = errors, EntityWarnings = warnings, EntityTypeFilePaths = filePaths.AdditionalFiles, ContextFilePath = filePaths.ContextFile, ContextConfigurationFilePaths = entityTypeConfigurationPaths, }; return(result); }
public static ReverseEngineerResult GenerateFiles(ReverseEngineerCommandOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } var errors = new List <string>(); var warnings = new List <string>(); var serviceProvider = ServiceProviderBuilder.Build(options); 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("'", "''", StringComparison.OrdinalIgnoreCase); } #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; var scaffolder = serviceProvider.GetService <IReverseEngineerScaffolder>(); SavedModelFiles filePaths = scaffolder.GenerateDbContext(options, schemas, outputContextDir, modelNamespace, contextNamespace); if (options.SelectedToBeGenerated != 2) { bool supportsRoutines = options.DatabaseType == DatabaseType.SQLServerDacpac || options.DatabaseType == DatabaseType.SQLServer; procedurePaths = scaffolder.GenerateStoredProcedures(options, ref errors, outputContextDir, modelNamespace, contextNamespace, supportsRoutines); if (procedurePaths != null) { var dbContextLines = File.ReadAllLines(filePaths.ContextFile).ToList(); var index = dbContextLines.IndexOf(" OnModelCreatingPartial(modelBuilder);"); if (index != -1) { dbContextLines.Insert(index, " OnModelCreatingGeneratedProcedures(modelBuilder);"); RetryFileWrite(filePaths.ContextFile, dbContextLines); } } functionPaths = scaffolder.GenerateFunctions(options, ref errors, outputContextDir, modelNamespace, contextNamespace, supportsRoutines); #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);"); RetryFileWrite(filePaths.ContextFile, dbContextLines); } } #endif RemoveFragments(filePaths.ContextFile, options.ContextClassName, options.IncludeConnectionString, options.UseNoDefaultConstructor); if (!options.UseHandleBars) { PostProcess(filePaths.ContextFile, options.UseNullableReferences, !options.LegacyLangVersion); } entityTypeConfigurationPaths = SplitDbContext(filePaths.ContextFile, options.UseDbContextSplitting, contextNamespace, options.UseNullableReferences); } else if (options.Tables.Any(t => t.ObjectType == ObjectType.Procedure) || options.Tables.Any(t => t.ObjectType == ObjectType.ScalarFunction)) { 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, !options.LegacyLangVersion); } } 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); }