private async Task <bool> ChooseDataBaseConnectionByUiHintAsync(ReverseEngineerOptions options) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var databaseList = vsDataHelper.GetDataConnections(package); if (databaseList != null && databaseList.Any()) { var dataBaseInfo = databaseList.Values.FirstOrDefault(m => m.ConnectionName == options.UiHint); if (dataBaseInfo != null) { options.ConnectionString = dataBaseInfo.ConnectionString; options.DatabaseType = dataBaseInfo.DatabaseType; return(true); } } var dacpacList = await EnvDteExtensions.GetDacpacFilesInActiveSolutionAsync(); if (dacpacList != null && dacpacList.Any() && !string.IsNullOrEmpty(options.UiHint) && options.UiHint.EndsWith(".sqlproj", StringComparison.OrdinalIgnoreCase)) { var candidate = dacpacList .Where(m => !string.IsNullOrWhiteSpace(m) && m.EndsWith(".sqlproj")) .FirstOrDefault(m => m.Equals(options.UiHint, StringComparison.OrdinalIgnoreCase)); if (candidate != null) { options.Dacpac = candidate; return(true); } } return(false); }
private bool ChooseDataBaseConnectionByUiHint(ReverseEngineerOptions options) { ThreadHelper.ThrowIfNotOnUIThread(); var databaseList = vsDataHelper.GetDataConnections(_package); if (databaseList != null && databaseList.Any()) { var dataBaseInfo = databaseList.Values.FirstOrDefault(m => m.Caption == options.UiHint); if (dataBaseInfo != null) { options.ConnectionString = dataBaseInfo.ConnectionString; options.DatabaseType = dataBaseInfo.DatabaseType; return(true); } } return(false); }
private bool ChooseDataBaseConnectionByUiHint(ReverseEngineerOptions options) { ThreadHelper.ThrowIfNotOnUIThread(); var databaseList = vsDataHelper.GetDataConnections(_package); if (databaseList != null && databaseList.Any()) { var dataBaseInfo = databaseList.Values.FirstOrDefault(m => m.ConnectionName == options.UiHint); if (dataBaseInfo != null) { options.ConnectionString = dataBaseInfo.ConnectionString; options.DatabaseType = dataBaseInfo.DatabaseType; return(true); } } var dacpacList = _package.Dte2.DTE.GetDacpacFilesInActiveSolution(EnvDteHelper.GetProjectFilesInSolution(_package)); if (dacpacList != null && dacpacList.Any()) { if (!string.IsNullOrEmpty(options.UiHint) && options.UiHint.EndsWith(".sqlproj", StringComparison.OrdinalIgnoreCase)) { var candidate = dacpacList .Where(m => !string.IsNullOrWhiteSpace(m) && m.EndsWith(".sqlproj")) .FirstOrDefault(m => m.Equals(options.UiHint, StringComparison.OrdinalIgnoreCase)); if (candidate != null) { options.Dacpac = candidate; return(true); } } } return(false); }
public async System.Threading.Tasks.Task HandleComparisonAsync(string outputPath, Project project) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { if (await VSHelper.IsDebugModeAsync()) { VSHelper.ShowError(CompareLocale.CannotCompareContextToDatabaseWhileDebugging); return; } if (project == null) { throw new ArgumentNullException(nameof(project)); } if (await project.GetAttributeAsync("TargetFrameworkMoniker") == null) { VSHelper.ShowError(SharedLocale.SelectedProjectTypeNoTargetFrameworkMoniker); return; } if (!await project.IsNetCore31OrHigherAsync()) { VSHelper.ShowError($"{SharedLocale.SupportedFramework}: {await project.GetAttributeAsync("TargetFrameworkMoniker")}"); return; } var result = await project.ContainsEfSchemaCompareReferenceAsync(); if (!result.Item1) { if (!Version.TryParse(result.Item2, out Version version)) { VSHelper.ShowError(string.Format(CultureInfo.InvariantCulture, CompareLocale.CannotSupportVersion, result.Item2)); return; } if (version.Major != 5 && version.Major != 6) { VSHelper.ShowError(CompareLocale.VersionSupported); return; } var nugetHelper = new NuGetHelper(); if (version.Major == 6) { await nugetHelper.InstallPackageAsync("EfCore.SchemaCompare", project, new Version(6, 0, 0)); } else if (version.Major == 5) { await nugetHelper.InstallPackageAsync("EfCore.SchemaCompare", project, new Version(5, 1, 3)); } VSHelper.ShowError(CompareLocale.InstallingEfCoreSchemaCompare); return; } await VS.StatusBar.ShowMessageAsync(CompareLocale.LoadingData); await VS.StatusBar.StartAnimationAsync(StatusAnimation.Build); var databaseList = vsDataHelper.GetDataConnections(package); var contextTypes = await GetDbContextTypesAsync(outputPath, project); var optionsDialog = package.GetView <ICompareOptionsDialog>(); if (databaseList != null && databaseList.Any()) { optionsDialog.AddConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.ConnectionName, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType, DataConnection = m.Value.DataConnection, })); } optionsDialog.AddContextTypes(contextTypes); await VS.StatusBar.EndAnimationAsync(StatusAnimation.Build); await VS.StatusBar.ClearAsync(); var pickDataSourceResult = optionsDialog.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return; } if (!pickDataSourceResult.Payload.ContextTypes.Any()) { VSHelper.ShowError(CompareLocale.NoContextsSelected); return; } pickDataSourceResult.Payload.Connection.DataConnection.Open(); pickDataSourceResult.Payload.Connection.ConnectionString = DataProtection.DecryptString(pickDataSourceResult.Payload.Connection.DataConnection.EncryptedConnectionString); await VS.StatusBar.ShowMessageAsync(CompareLocale.ComparingDatabaseWithContexts); await VS.StatusBar.StartAnimationAsync(StatusAnimation.Build); var timer = new Stopwatch(); timer.Start(); var comparisonResult = await GetComparisonResultAsync( outputPath, project, pickDataSourceResult.Payload.Connection, pickDataSourceResult.Payload.ContextTypes.ToArray()); timer.Stop(); await VS.StatusBar.EndAnimationAsync(StatusAnimation.Build); await VS.StatusBar.ShowMessageAsync(string.Format(CompareLocale.CompareCompletedIn, timer.Elapsed.ToString("h\\:mm\\:ss"))); if (comparisonResult.Any()) { var resultDialog = package.GetView <ICompareResultDialog>(); resultDialog.AddComparisonResult(comparisonResult); resultDialog.ShowAndAwaitUserResponse(true); } else { VSHelper.ShowMessage(CompareLocale.ContextDatabaseMatch); } await VS.StatusBar.ClearAsync(); Telemetry.TrackEvent("PowerTools.Compare"); } catch (AggregateException ae) { foreach (var innerException in ae.Flatten().InnerExceptions) { package.LogError(new List <string>(), innerException); } } catch (Exception exception) { package.LogError(new List <string>(), exception); } }
public async System.Threading.Tasks.Task ReverseEngineerCodeFirstAsync(Project project) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { var dteH = new EnvDteHelper(); string dacpacSchema = null; if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var projectPath = project.Properties.Item("FullPath")?.Value.ToString(); var optionsPaths = project.GetConfigFiles(); var optionsPath = optionsPaths.First(); var renamingPath = project.GetRenamingPath(); if (optionsPaths.Count > 1) { var pcd = _package.GetView <IPickConfigDialog>(); pcd.PublishConfigurations(optionsPaths.Select(m => new ConfigModel { ConfigPath = m, })); var pickConfigResult = pcd.ShowAndAwaitUserResponse(true); if (!pickConfigResult.ClosedByOK) { return; } optionsPath = pickConfigResult.Payload.ConfigPath; } var databaseList = VsDataHelper.GetDataConnections(_package); var dacpacList = _package.Dte2.DTE.GetDacpacFilesInActiveSolution(EnvDteHelper.GetProjectFilesInSolution(_package)); var options = ReverseEngineerOptionsExtensions.TryRead(optionsPath); var psd = _package.GetView <IPickServerDatabaseDialog>(); if (databaseList != null && databaseList.Any()) { psd.PublishConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.Caption, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType, DataConnection = m.Value.DataConnection, })); } if (dacpacList != null && dacpacList.Any()) { psd.PublishDefinitions(dacpacList.Select(m => new DatabaseDefinitionModel { FilePath = m })); } if (options != null && options.FilterSchemas && options.Schemas != null && options.Schemas.Any()) { psd.PublishSchemas(options.Schemas); } if (options != null) { psd.PublishCodeGenerationMode(options.CodeGenerationMode); } var pickDataSourceResult = psd.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return; } var useEFCore5 = pickDataSourceResult.Payload.IncludeViews; var filterSchemas = pickDataSourceResult.Payload.FilterSchemas; var schemas = filterSchemas ? pickDataSourceResult.Payload.Schemas : null; _package.Dte2.StatusBar.Text = "Getting ready to connect..."; // Reload the database list, in case the user has added a new database in the dialog databaseList = VsDataHelper.GetDataConnections(_package); DatabaseInfo dbInfo = null; if (pickDataSourceResult.Payload.Connection != null) { dbInfo = databaseList.Single(m => m.Value.ConnectionString == pickDataSourceResult.Payload.Connection?.ConnectionString).Value; } var dacpacPath = pickDataSourceResult.Payload.Definition?.FilePath; if (dbInfo == null) { dbInfo = new DatabaseInfo(); } if (!string.IsNullOrEmpty(dacpacPath)) { dbInfo.DatabaseType = DatabaseType.SQLServerDacpac; dbInfo.ConnectionString = $"Data Source=(local);Initial Catalog={Path.GetFileNameWithoutExtension(dacpacPath)};Integrated Security=true;"; dacpacPath = _package.Dte2.DTE.BuildSqlProj(dacpacPath); if (string.IsNullOrEmpty(dacpacPath)) { EnvDteHelper.ShowMessage("Unable to build selected Database Project"); return; } } if (dbInfo.DatabaseType == DatabaseType.SQLCE35 || dbInfo.DatabaseType == DatabaseType.SQLCE40 || dbInfo.DatabaseType == DatabaseType.Undefined) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } //TODO Enable when Oracle EF Core 5 provider is released if (useEFCore5 && (dbInfo.DatabaseType == DatabaseType.Oracle)) { EnvDteHelper.ShowError($"Unsupported provider with EF Core 5.0: {dbInfo.DatabaseType}"); return; } _package.Dte2.StatusBar.Text = "Loading database objects..."; object icon = (short)Microsoft.VisualStudio.Shell.Interop.Constants.SBAI_Build; _package.Dte2.StatusBar.Animate(true, icon); var predefinedTables = !string.IsNullOrEmpty(dacpacPath) ? await GetDacpacTablesAsync(dacpacPath, useEFCore5) : await GetTablesAsync(dbInfo, useEFCore5, schemas); _package.Dte2.StatusBar.Animate(false, icon); var preselectedTables = new List <SerializationTableModel>(); if (options != null) { dacpacSchema = options.DefaultDacpacSchema; if (options.Tables.Count > 0) { var normalizedTables = reverseEngineerHelper.NormalizeTables(options.Tables, dbInfo.DatabaseType == DatabaseType.SQLServer); preselectedTables.AddRange(normalizedTables); } } var namingOptionsAndPath = CustomNameOptionsExtensions.TryRead(renamingPath, optionsPath); _package.Dte2.StatusBar.Clear(); var ptd = _package.GetView <IPickTablesDialog>() .AddTables(predefinedTables, namingOptionsAndPath.Item1) .PreselectTables(preselectedTables); var pickTablesResult = ptd.ShowAndAwaitUserResponse(true); if (!pickTablesResult.ClosedByOK) { return; } _package.Dte2.StatusBar.Text = "Loading options..."; var classBasis = VsDataHelper.GetDatabaseName(dbInfo.ConnectionString, dbInfo.DatabaseType); var model = reverseEngineerHelper.GenerateClassName(classBasis) + "Context"; var packageResult = project.ContainsEfCoreReference(dbInfo.DatabaseType); var presets = new ModelingOptionsModel { InstallNuGetPackage = !packageResult.Item1, ModelName = options != null ? options.ContextClassName : model, ProjectName = project.Name, Namespace = options != null ? options.ProjectRootNamespace : project.Properties.Item("DefaultNamespace").Value.ToString(), DacpacPath = dacpacPath, }; if (options != null) { presets.UseDataAnnotations = !options.UseFluentApiOnly; presets.UseDatabaseNames = options.UseDatabaseNames; presets.UsePluralizer = options.UseInflector; presets.UseDbContextSplitting = options.UseDbContextSplitting; presets.UseHandlebars = options.UseHandleBars; presets.SelectedHandlebarsLanguage = options.SelectedHandlebarsLanguage; presets.IncludeConnectionString = options.IncludeConnectionString; presets.ModelName = options.ContextClassName; presets.Namespace = options.ProjectRootNamespace; presets.OutputPath = options.OutputPath; presets.OutputContextPath = options.OutputContextPath; presets.ModelNamespace = options.ModelNamespace; presets.ContextNamespace = options.ContextNamespace; presets.SelectedToBeGenerated = options.SelectedToBeGenerated; presets.DacpacPath = options.Dacpac; presets.UseEf6Pluralizer = options.UseLegacyPluralizer; presets.MapSpatialTypes = options.UseSpatial; presets.MapNodaTimeTypes = options.UseNodaTime; presets.UseBoolPropertiesWithoutDefaultSql = options.UseBoolPropertiesWithoutDefaultSql; presets.UseNoConstructor = options.UseNoConstructor; presets.UseNoNavigations = options.UseNoNavigations; presets.UseNullableReferences = options.UseNullableReferences; } var modelDialog = _package.GetView <IModelingOptionsDialog>() .ApplyPresets(presets); _package.Dte2.StatusBar.Clear(); var modelingOptionsResult = modelDialog.ShowAndAwaitUserResponse(true); if (!modelingOptionsResult.ClosedByOK) { return; } options = new ReverseEngineerOptions { UseFluentApiOnly = !modelingOptionsResult.Payload.UseDataAnnotations, ConnectionString = dbInfo.ConnectionString, ContextClassName = modelingOptionsResult.Payload.ModelName, DatabaseType = dbInfo.DatabaseType, ProjectPath = projectPath, OutputPath = modelingOptionsResult.Payload.OutputPath, OutputContextPath = modelingOptionsResult.Payload.OutputContextPath, ContextNamespace = modelingOptionsResult.Payload.ContextNamespace, ModelNamespace = modelingOptionsResult.Payload.ModelNamespace, ProjectRootNamespace = modelingOptionsResult.Payload.Namespace, UseDatabaseNames = modelingOptionsResult.Payload.UseDatabaseNames, UseInflector = modelingOptionsResult.Payload.UsePluralizer, UseLegacyPluralizer = modelingOptionsResult.Payload.UseEf6Pluralizer, UseSpatial = modelingOptionsResult.Payload.MapSpatialTypes, UseNodaTime = modelingOptionsResult.Payload.MapNodaTimeTypes, UseDbContextSplitting = modelingOptionsResult.Payload.UseDbContextSplitting, UseHandleBars = modelingOptionsResult.Payload.UseHandlebars, SelectedHandlebarsLanguage = modelingOptionsResult.Payload.SelectedHandlebarsLanguage, IncludeConnectionString = modelingOptionsResult.Payload.IncludeConnectionString, SelectedToBeGenerated = modelingOptionsResult.Payload.SelectedToBeGenerated, UseBoolPropertiesWithoutDefaultSql = modelingOptionsResult.Payload.UseBoolPropertiesWithoutDefaultSql, UseNullableReferences = modelingOptionsResult.Payload.UseNullableReferences, UseNoConstructor = modelingOptionsResult.Payload.UseNoConstructor, UseNoNavigations = modelingOptionsResult.Payload.UseNoNavigations, Dacpac = dacpacPath, DefaultDacpacSchema = dacpacSchema, Tables = pickTablesResult.Payload.Objects.ToList(), CustomReplacers = pickTablesResult.Payload.CustomReplacers.ToList(), FilterSchemas = filterSchemas, Schemas = schemas?.ToList(), CodeGenerationMode = pickDataSourceResult.Payload.IncludeViews ? CodeGenerationMode.EFCore5 : CodeGenerationMode.EFCore3, }; if (options.DatabaseType == DatabaseType.SQLServer && string.IsNullOrEmpty(options.Dacpac)) { var rightsAndVersion = reverseEngineerHelper.HasSqlServerViewDefinitionRightsAndVersion(options.ConnectionString); if (rightsAndVersion.Item1 == false) { EnvDteHelper.ShowMessage("The SQL Server user does not have 'VIEW DEFINITION' rights, default constraints may not be available."); } if (rightsAndVersion.Item2.Major < 11) { EnvDteHelper.ShowMessage($"SQL Server version {rightsAndVersion.Item2} may not be supported."); } } var tfm = project.Properties.Item("TargetFrameworkMoniker").Value.ToString(); bool isNetStandard = tfm.Contains(".NETStandard,Version=v2."); if (modelingOptionsResult.Payload.UseHandlebars) { var dropped = (DropTemplates(projectPath, useEFCore5)); if (dropped && !project.IsNetCore() && !isNetStandard) { project.ProjectItems.AddFromDirectory(Path.Combine(projectPath, "CodeTemplates")); } } var startTime = DateTime.Now; _package.Dte2.StatusBar.Animate(true, icon); _package.Dte2.StatusBar.Text = "Generating code..."; var revEngResult = EfRevEngLauncher.LaunchExternalRunner(options, useEFCore5); _package.Dte2.StatusBar.Animate(false, icon); if (modelingOptionsResult.Payload.SelectedToBeGenerated == 0 || modelingOptionsResult.Payload.SelectedToBeGenerated == 2) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { if (!project.IsNetCore() && !isNetStandard) { project.ProjectItems.AddFromFile(filePath); } } if (modelingOptionsResult.Payload.SelectedToBeGenerated == 2) { if (File.Exists(revEngResult.ContextFilePath)) { File.Delete(revEngResult.ContextFilePath); } foreach (var filePath in revEngResult.ContextConfigurationFilePaths) { if (File.Exists(filePath)) { File.Delete(filePath); } } } } if (modelingOptionsResult.Payload.SelectedToBeGenerated == 0 || modelingOptionsResult.Payload.SelectedToBeGenerated == 1) { if (!project.IsNetCore() && !isNetStandard) { foreach (var filePath in revEngResult.ContextConfigurationFilePaths) { project.ProjectItems.AddFromFile(filePath); } project.ProjectItems.AddFromFile(revEngResult.ContextFilePath); } _package.Dte2.ItemOperations.OpenFile(revEngResult.ContextFilePath); if (modelingOptionsResult.Payload.SelectedToBeGenerated == 1) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { if (File.Exists(filePath)) { File.Delete(filePath); } } } } var duration = DateTime.Now - startTime; var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2; if (modelingOptionsResult.Payload.InstallNuGetPackage || modelingOptionsResult.Payload.SelectedToBeGenerated == 2) { missingProviderPackage = null; } _package.Dte2.StatusBar.Text = "Reporting result..."; var errors = reverseEngineerHelper.ReportRevEngErrors(revEngResult, missingProviderPackage); SaveOptions(project, optionsPath, options, new Tuple <List <Schema>, string>(pickTablesResult.Payload.CustomReplacers.ToList(), namingOptionsAndPath.Item2)); if (modelingOptionsResult.Payload.InstallNuGetPackage) { _package.Dte2.StatusBar.Text = "Installing EF Core provider package"; var nuGetHelper = new NuGetHelper(); await nuGetHelper.InstallPackageAsync(packageResult.Item2, project); } _package.Dte2.StatusBar.Text = $"Reverse engineer completed in {duration:h\\:mm\\:ss}"; EnvDteHelper.ShowMessage(errors); if (revEngResult.EntityErrors.Count > 0) { _package.LogError(revEngResult.EntityErrors, null); } if (revEngResult.EntityWarnings.Count > 0) { _package.LogError(revEngResult.EntityWarnings, null); } Telemetry.TrackEvent("PowerTools.ReverseEngineer"); } catch (AggregateException ae) { foreach (var innerException in ae.Flatten().InnerExceptions) { _package.LogError(new List <string>(), innerException); } } catch (Exception exception) { _package.LogError(new List <string>(), exception); } }
public async System.Threading.Tasks.Task HandleComparisonAsync(string outputPath, Project project) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError(CompareLocale.CannotCompareContextToDatabaseWhileDebugging); return; } if (project == null) { throw new ArgumentNullException(nameof(project)); } if (project.Properties.Item("TargetFrameworkMoniker") == null) { EnvDteHelper.ShowError(SharedLocale.SelectedProjectTypeNoTargetFrameworkMoniker); return; } if (!project.IsNetCore30OrHigher()) { EnvDteHelper.ShowError($"{SharedLocale.SupportedFramework}: {project.Properties.Item("TargetFrameworkMoniker").Value}"); return; } var result = await project.ContainsEfSchemaCompareReferenceAsync(); if (!result.Item1) { if (!Version.TryParse(result.Item2, out Version version)) { EnvDteHelper.ShowError(String.Format(CompareLocale.CannotSupportVersion, result.Item2)); return; } if (version.Major != 5) { EnvDteHelper.ShowError(CompareLocale.VersionSupported); return; } var nugetHelper = new NuGetHelper(); nugetHelper.InstallPackage("EfCore.SchemaCompare", project, new Version(5, 1, 3)); EnvDteHelper.ShowError(CompareLocale.InstallingEfCoreSchemaCompare); return; } _package.Dte2.StatusBar.Text = CompareLocale.LoadingData; object icon = (short)Microsoft.VisualStudio.Shell.Interop.Constants.SBAI_Build; _package.Dte2.StatusBar.Animate(true, icon); var databaseList = vsDataHelper.GetDataConnections(_package); var contextTypes = await GetDbContextTypesAsync(outputPath, project); var optionsDialog = _package.GetView <ICompareOptionsDialog>(); if (databaseList != null && databaseList.Any()) { optionsDialog.AddConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.Caption, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType, DataConnection = m.Value.DataConnection, })); } optionsDialog.AddContextTypes(contextTypes); _package.Dte2.StatusBar.Animate(false, icon); _package.Dte2.StatusBar.Clear(); var pickDataSourceResult = optionsDialog.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return; } if (!pickDataSourceResult.Payload.ContextTypes.Any()) { EnvDteHelper.ShowError(CompareLocale.NoContextsSelected); return; } pickDataSourceResult.Payload.Connection.DataConnection.Open(); pickDataSourceResult.Payload.Connection.ConnectionString = DataProtection.DecryptString(pickDataSourceResult.Payload.Connection.DataConnection.EncryptedConnectionString); _package.Dte2.StatusBar.Text = CompareLocale.ComparingDatabaseWithContexts; _package.Dte2.StatusBar.Animate(true, icon); var timer = new Stopwatch(); timer.Start(); var comparisonResult = await GetComparisonResultAsync( outputPath, project, pickDataSourceResult.Payload.Connection, pickDataSourceResult.Payload.ContextTypes.ToArray()); timer.Stop(); _package.Dte2.StatusBar.Animate(false, icon); _package.Dte2.StatusBar.Text = String.Format(CompareLocale.CompareCompletedIn, timer.Elapsed.ToString("h\\:mm\\:ss")); if (comparisonResult.Any()) { var resultDialog = _package.GetView <ICompareResultDialog>(); resultDialog.AddComparisonResult(comparisonResult); resultDialog.ShowAndAwaitUserResponse(true); } else { EnvDteHelper.ShowMessage(CompareLocale.ContextDatabaseMatch); } _package.Dte2.StatusBar.Clear(); Telemetry.TrackEvent("PowerTools.Compare"); } catch (AggregateException ae) { foreach (var innerException in ae.Flatten().InnerExceptions) { _package.LogError(new List <string>(), innerException); } } catch (Exception exception) { _package.LogError(new List <string>(), exception); } }
public async System.Threading.Tasks.Task HandleComparisonAsync(string outputPath, Project project) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot compare context to database while debugging"); return; } if (project == null) { throw new ArgumentNullException(nameof(project)); } if (project.Properties.Item("TargetFrameworkMoniker") == null) { EnvDteHelper.ShowError("The selected project type has no TargetFrameworkMoniker"); return; } if (!project.IsNetCore30OrHigher()) { EnvDteHelper.ShowError("Only .NET Core 3.0+ projects are supported - TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value); return; } var result = await project.ContainsEfCoreDesignReferenceAsync(); if (!result.Item1) { if (!Version.TryParse(result.Item2, out Version version)) { EnvDteHelper.ShowError($"Cannot support version {result.Item2}, notice that previews have limited supported. You can try to manually install Microsoft.EntityFrameworkCore.Design preview."); return; } if (version.Major != 5) { EnvDteHelper.ShowError($"Only EF Core 5 is supported."); return; } var nugetHelper = new NuGetHelper(); nugetHelper.InstallPackage("EfCore.SchemaCompare", project, new Version(5, 1, 3)); EnvDteHelper.ShowError($"Installing EfCore.SchemaCompare version 5.1.3, please retry the command"); return; } _package.Dte2.StatusBar.Text = "Loading data"; object icon = (short)Microsoft.VisualStudio.Shell.Interop.Constants.SBAI_Build; _package.Dte2.StatusBar.Animate(true, icon); var databaseList = VsDataHelper.GetDataConnections(_package); var contextTypes = await GetDbContextTypesAsync(outputPath, project); var optionsDialog = _package.GetView <ICompareOptionsDialog>(); if (databaseList != null && databaseList.Any()) { optionsDialog.AddConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.Caption, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType, DataConnection = m.Value.DataConnection, })); } optionsDialog.AddContextTypes(contextTypes); _package.Dte2.StatusBar.Animate(false, icon); _package.Dte2.StatusBar.Clear(); var pickDataSourceResult = optionsDialog.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return; } pickDataSourceResult.Payload.Connection.DataConnection.Open(); pickDataSourceResult.Payload.Connection.ConnectionString = DataProtection.DecryptString(pickDataSourceResult.Payload.Connection.DataConnection.EncryptedConnectionString); _package.Dte2.StatusBar.Text = "Comparing database with context(s)..."; _package.Dte2.StatusBar.Animate(true, icon); var timer = new Stopwatch(); timer.Start(); var comparisonResult = await GetComparisonResultAsync( outputPath, project, pickDataSourceResult.Payload.Connection, pickDataSourceResult.Payload.ContextTypes.ToArray()); timer.Stop(); _package.Dte2.StatusBar.Animate(false, icon); _package.Dte2.StatusBar.Text = $"Compare completed in {timer.Elapsed:h\\:mm\\:ss}"; if (comparisonResult.Any()) { var resultDialog = _package.GetView <ICompareResultDialog>(); resultDialog.AddComparisonResult(comparisonResult); resultDialog.ShowAndAwaitUserResponse(true); } else { EnvDteHelper.ShowMessage("Context(s) and database structure match"); } _package.Dte2.StatusBar.Clear(); Telemetry.TrackEvent("PowerTools.Compare"); } catch (AggregateException ae) { foreach (var innerException in ae.Flatten().InnerExceptions) { _package.LogError(new List <string>(), innerException); } } catch (Exception exception) { _package.LogError(new List <string>(), exception); } }
private bool ChooseDataBaseConnection(ReverseEngineerOptions options) { ThreadHelper.ThrowIfNotOnUIThread(); var databaseList = VsDataHelper.GetDataConnections(_package); var dacpacList = _package.Dte2.DTE.GetDacpacFilesInActiveSolution(EnvDteHelper.GetProjectFilesInSolution(_package)); var psd = _package.GetView <IPickServerDatabaseDialog>(); if (databaseList != null && databaseList.Any()) { psd.PublishConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.Caption, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType, DataConnection = m.Value.DataConnection, })); } if (dacpacList != null && dacpacList.Any()) { psd.PublishDefinitions(dacpacList.Select(m => new DatabaseDefinitionModel { FilePath = m })); } if (options.FilterSchemas && options.Schemas != null && options.Schemas.Any()) { psd.PublishSchemas(options.Schemas); } psd.PublishCodeGenerationMode(options.CodeGenerationMode); if (!string.IsNullOrEmpty(options.UiHint)) { psd.PublishUiHint(options.UiHint); } var pickDataSourceResult = psd.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return(false); } options.CodeGenerationMode = pickDataSourceResult.Payload.IncludeViews ? CodeGenerationMode.EFCore5 : CodeGenerationMode.EFCore3; options.FilterSchemas = pickDataSourceResult.Payload.FilterSchemas; options.Schemas = options.FilterSchemas ? pickDataSourceResult.Payload.Schemas?.ToList() : null; options.UiHint = pickDataSourceResult.Payload.UiHint; options.Dacpac = pickDataSourceResult.Payload.Definition?.FilePath; if (pickDataSourceResult.Payload.Connection != null) { options.ConnectionString = pickDataSourceResult.Payload.Connection.ConnectionString; options.DatabaseType = pickDataSourceResult.Payload.Connection.DatabaseType; } return(true); }