public void GenerateServerDgmlFiles() { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } // Show dialog with SqlClient selected by default var dialogFactory = _package.GetService <IVsDataConnectionDialogFactory>(); var dialog = dialogFactory.CreateConnectionDialog(); dialog.AddAllSources(); dialog.SelectedSource = new Guid("067ea0d9-ba62-43f7-9106-34930c60c528"); var dialogResult = dialog.ShowDialog(connect: true); if (dialogResult == null) { return; } _package.Dte2.StatusBar.Text = "Loading schema information..."; var dbInfo = GetDatabaseInfo(dialogResult, DataProtection.DecryptString(dialog.EncryptedConnectionString)); if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog(); using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var path = Path.GetTempFileName() + ".dgml"; using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var generator = RepositoryHelper.CreateGenerator(repository, path, dbInfo.DatabaseType); generator.GenerateSchemaGraph(dbInfo.ConnectionString, ptd.Tables); _package.Dte2.ItemOperations.OpenFile(path); _package.Dte2.ActiveDocument.Activate(); } } catch (Exception ex) { _package.LogError(new List <string>(), ex); } }
public void GenerateServerDgmlFiles() { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var databaseList = EnvDteHelper.GetDataConnections(_package); var psd = new PickServerDatabaseDialog(databaseList, _package); var diagRes = psd.ShowModal(); if (!diagRes.HasValue || !diagRes.Value) { return; } _package.Dte2.StatusBar.Text = "Loading schema information..."; var dbInfo = psd.SelectedDatabase.Value; if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog(); using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var path = Path.GetTempFileName() + ".dgml"; using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var generator = RepositoryHelper.CreateGenerator(repository, path, dbInfo.DatabaseType); generator.GenerateSchemaGraph(dbInfo.ConnectionString, ptd.Tables); _package.Dte2.ItemOperations.OpenFile(path); _package.Dte2.ActiveDocument.Activate(); } Telemetry.TrackEvent("PowerTools.GenerateSchemaDgml"); } catch (Exception ex) { _package.LogError(new List <string>(), ex); } }
public void ScriptDatabase(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters; if (databaseInfo == null) { return; } Scope scope = (Scope)menuItem.Tag; SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Save generated database script as"; fd.Filter = "SQL Server Compact Script (*.sqlce)|*.sqlce|SQL Server Script (*.sql)|*.sql|All Files(*.*)|*.*"; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { var fileName = fd.FileName; int totalCount = 0; PickTablesDialog ptd = new PickTablesDialog(); using (IRepository repository = RepoHelper.CreateRepository(databaseInfo.Connectionstring)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } ptd.Owner = Application.Current.MainWindow; bool?res = ptd.ShowDialog(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { try { using (IRepository repository = RepoHelper.CreateRepository(databaseInfo.Connectionstring)) { var generator = RepoHelper.CreateGenerator(repository, fd.FileName); generator.ExcludeTables(ptd.Tables); System.Windows.Forms.MessageBox.Show(generator.ScriptDatabaseToFile(scope)); } } catch (Exception ex) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ex)); } } } }
public void ScriptServerDatabase(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } Scope scope = (Scope)menuItem.Tag; var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters; if (databaseInfo == null) { return; } try { string connectionString = databaseInfo.DatabaseInfo != null ? databaseInfo.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(package); if (!string.IsNullOrEmpty(connectionString)) { string fileName; PickTablesDialog ptd = new PickTablesDialog(); int totalCount = 0; using (IRepository repository = Helpers.DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } bool?res = ptd.ShowModal(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Save generated database script as"; fd.Filter = "SQL Server Compact Script (*.sqlce)|*.sqlce|SQL Server Script (*.sql)|*.sql|All Files(*.*)|*.*"; if (scope == Scope.SchemaDataSQLite || scope == Scope.SchemaSQLite) { fd.Filter = "SQL Script (*.sql)|*.sql|All Files(*.*)|*.*"; } fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { fileName = fd.FileName; using (IRepository repository = Helpers.DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { try { var generator = Helpers.DataConnectionHelper.CreateGenerator(repository, fd.FileName, DatabaseType.SQLServer); generator.ExcludeTables(ptd.Tables); EnvDTEHelper.ShowMessage(generator.ScriptDatabaseToFile(scope)); Helpers.DataConnectionHelper.LogUsage("DatabasesScriptServer"); } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } } } } } } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } }
public async void ReverseEngineerCodeFirst(Project project) { try { var dteH = new EnvDteHelper(); var revEng = new EfCoreReverseEngineer(); string dacpacSchema = null; if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var startTime = DateTime.Now; var projectPath = project.Properties.Item("FullPath").Value.ToString(); var optionsPath = Path.Combine(projectPath, "efpt.config.json"); var databaseList = EnvDteHelper.GetDataConnections(_package); var dacpacList = _package.Dte2.DTE.GetDacpacFilesInActiveSolution(); var psd = new PickServerDatabaseDialog(databaseList, _package, dacpacList); if (psd.ShowModal() != true) { return; } _package.Dte2.StatusBar.Text = "Loading schema information..."; var dbInfo = psd.SelectedDatabase.Value; var dacpacPath = psd.DacpacPath; if (dbInfo == null) { dbInfo = new DatabaseInfo(); } if (!string.IsNullOrEmpty(dacpacPath)) { dbInfo.DatabaseType = DatabaseType.SQLServer; dbInfo.ConnectionString = "Data Source=.;Initial Catalog=" + Path.GetFileNameWithoutExtension(dacpacPath); dacpacPath = _package.Dte2.DTE.BuildSqlProj(dacpacPath); if (string.IsNullOrEmpty(dacpacPath)) { EnvDteHelper.ShowMessage("Unable to build selected Database Project"); return; } } if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog { IncludeTables = true }; if (!string.IsNullOrEmpty(dacpacPath)) { ptd.Tables = revEng.GetDacpacTableNames(dacpacPath); } else { ptd.Tables = GetTablesFromRepository(dbInfo); } var options = ReverseEngineerOptionsExtensions.TryRead(optionsPath); if (options != null) { dacpacSchema = options.DefaultDacpacSchema; if (options.Tables.Count > 0) { ptd.SelectedTables = options.Tables; } } if (ptd.ShowModal() != true) { return; } var classBasis = string.Empty; if (dbInfo.DatabaseType == DatabaseType.Npgsql) { classBasis = EnvDteHelper.GetNpgsqlDatabaseName(dbInfo.ConnectionString); } else { classBasis = RepositoryHelper.GetClassBasis(dbInfo.ConnectionString, dbInfo.DatabaseType); } var model = revEng.GenerateClassName(classBasis) + "Context"; var packageResult = project.ContainsEfCoreReference(dbInfo.DatabaseType); var modelDialog = new EfCoreModelDialog(options) { 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 }; _package.Dte2.StatusBar.Text = "Getting options..."; if (modelDialog.ShowModal() != true) { return; } options = new ReverseEngineerOptions { UseFluentApiOnly = !modelDialog.UseDataAnnotations, ConnectionString = dbInfo.ConnectionString, ContextClassName = modelDialog.ModelName, DatabaseType = (ReverseEngineer20.DatabaseType)dbInfo.DatabaseType, ProjectPath = projectPath, OutputPath = modelDialog.OutputPath, ProjectRootNamespace = modelDialog.NameSpace, UseDatabaseNames = modelDialog.UseDatabaseNames, UseInflector = modelDialog.UsePluralizer, IdReplace = modelDialog.ReplaceId, UseHandleBars = modelDialog.UseHandelbars, IncludeConnectionString = modelDialog.IncludeConnectionString, SelectedToBeGenerated = modelDialog.SelectedTobeGenerated, Dacpac = dacpacPath, DefaultDacpacSchema = dacpacSchema, Tables = ptd.Tables }; _package.Dte2.StatusBar.Text = "Generating code..."; var tfm = project.Properties.Item("TargetFrameworkMoniker").Value.ToString(); bool isNetCore = tfm.Contains(".NETCoreApp,Version=v2.0"); bool isNetStandard = tfm.Contains(".NETStandard,Version=v2.0"); //TODO await update //if (modelDialog.UseHandelbars) //{ // var dropped = (DropTemplates(projectPath)); // if (dropped && !isNetCore && !isNetStandard) // { // project.ProjectItems.AddFromDirectory(Path.Combine(projectPath, "CodeTemplates")); // } //} var revEngResult = revEng.GenerateFiles(options); if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 2) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { project.ProjectItems.AddFromFile(filePath); } if (modelDialog.SelectedTobeGenerated == 2) { if (File.Exists(revEngResult.ContextFilePath)) { File.Delete(revEngResult.ContextFilePath); } } } if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 1) { project.ProjectItems.AddFromFile(revEngResult.ContextFilePath); if (!isNetCore && !isNetStandard) { _package.Dte2.ItemOperations.OpenFile(revEngResult.ContextFilePath); } if (modelDialog.SelectedTobeGenerated == 1) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { if (File.Exists(filePath)) { File.Delete(filePath); } } } } var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2; if (modelDialog.InstallNuGetPackage) { missingProviderPackage = null; } _package.Dte2.StatusBar.Text = "Reporting result..."; var errors = ReportRevEngErrors(revEngResult, missingProviderPackage); SaveOptions(project, optionsPath, options); if (modelDialog.InstallNuGetPackage) { _package.Dte2.StatusBar.Text = "Installing EF Core provider package"; var nuGetHelper = new NuGetHelper(); await nuGetHelper.InstallPackageAsync(packageResult.Item2, project); } var duration = DateTime.Now - startTime; _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 void ReverseEngineerCodeFirst(Project project) { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var startTime = DateTime.Now; var databaseList = EnvDteHelper.GetDataConnections(_package); var psd = new PickServerDatabaseDialog(databaseList, _package); var diagRes = psd.ShowModal(); if (!diagRes.HasValue || !diagRes.Value) { return; } // Show dialog with SqlClient selected by default _package.Dte2.StatusBar.Text = "Loading schema information..."; var dbInfo = psd.SelectedDatabase.Value; if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog { IncludeTables = true }; using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var classBasis = RepositoryHelper.GetClassBasis(dbInfo.ConnectionString, dbInfo.DatabaseType); var dteH = new EnvDteHelper(); var revEng = new EfCoreReverseEngineer(); var model = revEng.GenerateClassName(classBasis) + "Context"; var packageResult = dteH.ContainsEfCoreReference(project, dbInfo.DatabaseType); var modelDialog = new EfCoreModelDialog { InstallNuGetPackage = !packageResult.Item1, ModelName = model, ProjectName = project.Name, NameSpace = project.Properties.Item("DefaultNamespace").Value.ToString() }; _package.Dte2.StatusBar.Text = "Getting options..."; var result = modelDialog.ShowModal(); if (!result.HasValue || result.Value != true) { return; } var projectPath = project.Properties.Item("FullPath").Value.ToString(); var options = new ReverseEngineerOptions { UseFluentApiOnly = !modelDialog.UseDataAnnotations, ConnectionString = dbInfo.ConnectionString, ContextClassName = modelDialog.ModelName, DatabaseType = (ReverseEngineer20.DatabaseType)dbInfo.DatabaseType, ProjectPath = projectPath, OutputPath = modelDialog.OutputPath, ProjectRootNamespace = modelDialog.NameSpace, UseDatabaseNames = modelDialog.UseDatabaseNames, UseInflector = modelDialog.UsePluralizer, IdReplace = modelDialog.ReplaceId, UseHandleBars = modelDialog.UseHandelbars, Tables = ptd.Tables }; _package.Dte2.StatusBar.Text = "Generating code..."; if (modelDialog.UseHandelbars) { if (DropTemplates(projectPath)) { project.ProjectItems.AddFromDirectory(Path.Combine(projectPath, "CodeTemplates")); } } var revEngResult = revEng.GenerateFiles(options); if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 2) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { project.ProjectItems.AddFromFile(filePath); } } if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 1) { project.ProjectItems.AddFromFile(revEngResult.ContextFilePath); _package.Dte2.ItemOperations.OpenFile(revEngResult.ContextFilePath); } packageResult = dteH.ContainsEfCoreReference(project, dbInfo.DatabaseType); var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2; if (modelDialog.InstallNuGetPackage) { missingProviderPackage = null; } _package.Dte2.StatusBar.Text = "Reporting result..."; var errors = ReportRevEngErrors(revEngResult, missingProviderPackage); if (modelDialog.InstallNuGetPackage) { _package.Dte2.StatusBar.Text = "Installing EF Core provider package"; var nuGetHelper = new NuGetHelper(); await nuGetHelper.InstallPackageAsync(packageResult.Item2, project); } var duration = DateTime.Now - startTime; _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); } }
private void ExportServerDatabaseToEmbedded(DatabaseType databaseType, DatabaseMenuCommandParameters parameters) { var filter = DataConnectionHelper.GetSqlCeFileFilter(); var scope = Scope.SchemaData; if (databaseType == DatabaseType.SQLite) { filter = DataConnectionHelper.GetSqliteFileFilter(); scope = Scope.SchemaDataSQLite; } Debug.Assert(databaseType == DatabaseType.SQLite || databaseType == DatabaseType.SQLCE40, "Unexpected database type"); try { var connectionString = parameters.DatabaseInfo != null ? parameters.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(_package); if (!string.IsNullOrEmpty(connectionString)) { var ptd = new PickTablesDialog(); int totalCount; using (var repository = DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } var res = ptd.ShowModal(); if (!res.HasValue || res.Value != true || (ptd.Tables.Count >= totalCount)) { return; } string dbConnectionString = null; var fd = new SaveFileDialog { Title = "Export as", Filter = filter, OverwritePrompt = true, ValidateNames = true }; var result = fd.ShowDialog(); if (!result.HasValue || result.Value != true) { return; } var dbName = fd.FileName; try { if (databaseType == DatabaseType.SQLCE40) { _package.SetStatus("Creating SQL Server Compact database..."); var helper = new SqlCeHelper4(); dbConnectionString = string.Format("Data Source={0};Max Database Size=4091", dbName); if (File.Exists(dbName)) { File.Delete(dbName); } helper.CreateDatabase(dbConnectionString); } if (databaseType == DatabaseType.SQLite) { _package.SetStatus("Creating SQLite database..."); var helper = new SqliteHelper(); dbConnectionString = string.Format("Data Source={0};", dbName); if (File.Exists(dbName)) { File.Delete(dbName); } helper.CreateDatabase(dbConnectionString); } var bw = new BackgroundWorker(); var workerParameters = new List <object> { dbConnectionString, connectionString, ptd.Tables, databaseType.ToString(), scope.ToString() }; bw.DoWork += bw_DoWork; bw.RunWorkerCompleted += (s, ea) => { try { if (ea.Error != null) { DataConnectionHelper.SendError(ea.Error, databaseType, false); } DataConnectionHelper.LogUsage("DatabasesExportFromServer"); } finally { bw.Dispose(); } }; bw.RunWorkerAsync(workerParameters); } catch (Exception ex) { DataConnectionHelper.SendError(ex, databaseType, false); } } } catch (Exception ex) { DataConnectionHelper.SendError(ex, DatabaseType.SQLServer); } }
public void ScriptDatabase(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } var scope = (Scope)menuItem.Tag; var databaseInfo = ValidateMenuInfo(sender); if (databaseInfo == null) { return; } try { int totalCount; var ptd = new PickTablesDialog(); using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } var res = ptd.ShowModal(); if (res == true && (ptd.Tables.Count < totalCount)) { var fd = new SaveFileDialog { Title = "Save generated script as", Filter = "SQL Server Compact Script (*.sqlce)|*.sqlce|SQL Server Script (*.sql)|*.sql|All Files(*.*)|*.*" }; if (scope == Scope.SchemaDataSQLite || scope == Scope.SchemaSQLite || databaseInfo.DatabaseInfo.DatabaseType == DatabaseType.SQLite) { fd.Filter = "SQLite Script (*.sql)|*.sql|All Files(*.*)|*.*"; } fd.OverwritePrompt = true; fd.ValidateNames = true; var result = fd.ShowDialog(); if (!result.HasValue || result.Value != true) { return; } using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo)) { var generator = DataConnectionHelper.CreateGenerator(repository, fd.FileName, databaseInfo.DatabaseInfo.DatabaseType); generator.ExcludeTables(ptd.Tables); EnvDteHelper.ShowMessage(generator.ScriptDatabaseToFile(scope)); DataConnectionHelper.LogUsage("DatabaseScriptCe"); } } } catch (Exception ex) { DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false); } }
public void ReverseEngineerCodeFirst(Project project) { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var startTime = DateTime.Now; // Show dialog with SqlClient selected by default var dialogFactory = _package.GetService <IVsDataConnectionDialogFactory>(); var dialog = dialogFactory.CreateConnectionDialog(); dialog.AddAllSources(); dialog.SelectedSource = new Guid("067ea0d9-ba62-43f7-9106-34930c60c528"); var dialogResult = dialog.ShowDialog(connect: true); if (dialogResult != null) { _package.Dte2.StatusBar.Text = "Loading schema information..."; // Find connection string and provider var connection = (DbConnection)dialogResult.GetLockedProviderObject(); var connectionString = connection.ConnectionString; var providerManager = (IVsDataProviderManager)Package.GetGlobalService(typeof(IVsDataProviderManager)); IVsDataProvider dp; providerManager.Providers.TryGetValue(dialogResult.Provider, out dp); var providerInvariant = (string)dp.GetProperty("InvariantName"); var dbType = DatabaseType.SQLCE35; if (providerInvariant == "System.Data.SqlServerCe.4.0") { dbType = DatabaseType.SQLCE40; } if (providerInvariant == "System.Data.SQLite.EF6") { dbType = DatabaseType.SQLite; } if (providerInvariant == "System.Data.SqlClient") { dbType = DatabaseType.SQLServer; } if (dbType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {providerInvariant}"); return; } var ptd = new PickTablesDialog { IncludeTables = true }; using (var repository = RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = dbType })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var classBasis = RepositoryHelper.GetClassBasis(connectionString, dbType); var dteH = new EnvDteHelper(); var revEng = new EfCoreReverseEngineer(); var model = revEng.GenerateClassName(classBasis) + "Context"; var packageResult = dteH.ContainsEfCoreReference(project, dbType); var modelDialog = new EfCoreModelDialog { InstallNuGetPackage = !packageResult.Item1, ModelName = model, ProjectName = project.Name, NameSpace = project.Properties.Item("DefaultNamespace").Value.ToString() }; _package.Dte2.StatusBar.Text = "Getting options..."; var result = modelDialog.ShowModal(); if (!result.HasValue || result.Value != true) { return; } var projectPath = project.Properties.Item("FullPath").Value.ToString(); var options = new ReverseEngineerOptions { UseFluentApiOnly = !modelDialog.UseDataAnnotations, ConnectionString = connectionString, ContextClassName = modelDialog.ModelName, DatabaseType = (EFCoreReverseEngineer.DatabaseType)dbType, ProjectPath = projectPath, OutputPath = modelDialog.OutputPath, ProjectRootNamespace = modelDialog.NameSpace, UseDatabaseNames = modelDialog.UseDatabaseNames, Tables = ptd.Tables }; _package.Dte2.StatusBar.Text = "Generating code..."; var revEngResult = revEng.GenerateFiles(options); if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 2) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { project.ProjectItems.AddFromFile(filePath); } } if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 1) { project.ProjectItems.AddFromFile(revEngResult.ContextFilePath); _package.Dte2.ItemOperations.OpenFile(revEngResult.ContextFilePath); } packageResult = dteH.ContainsEfCoreReference(project, dbType); var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2; if (modelDialog.InstallNuGetPackage) { missingProviderPackage = null; } _package.Dte2.StatusBar.Text = "Reporting result..."; var errors = ReportRevEngErrors(revEngResult, missingProviderPackage); if (modelDialog.InstallNuGetPackage) { _package.Dte2.StatusBar.Text = "Installing EF Core provider package"; var nuGetHelper = new NuGetHelper(); nuGetHelper.InstallPackage(packageResult.Item2, project); } var duration = DateTime.Now - startTime; _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); } } } catch (Exception exception) { _package.LogError(new List <string>(), exception); } }
public void GenerateServerDgmlFiles() { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var databaseList = EnvDteHelper.GetDataConnections(_package); var psd = new PickServerDatabaseDialog(databaseList, _package, new Dictionary <string, string>()); var diagRes = psd.ShowModal(); if (!diagRes.HasValue || !diagRes.Value) { return; } _package.Dte2.StatusBar.Text = "Loading schema information..."; var dbInfo = psd.SelectedDatabase.Value; if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog(); using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var ti = new List <TableInformation>(); var tables = repository.GetAllTableNamesForExclusion(); foreach (var table in tables) { ti.Add(TableInformation.Parse(table)); } ptd.Tables = ti; } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var name = RepositoryHelper.GetClassBasis(dbInfo.ConnectionString, dbInfo.DatabaseType); var path = Path.Combine(Path.GetTempPath(), name + ".schema.dgml"); if (File.Exists(path)) { File.SetAttributes(path, FileAttributes.Normal); } using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var generator = RepositoryHelper.CreateGenerator(repository, path, dbInfo.DatabaseType); generator.GenerateSchemaGraph(dbInfo.ConnectionString, ptd.Tables.Select(m => m.UnsafeFullName).ToList()); File.SetAttributes(path, FileAttributes.ReadOnly); _package.Dte2.ItemOperations.OpenFile(path); _package.Dte2.ActiveDocument.Activate(); } Telemetry.TrackEvent("PowerTools.GenerateSchemaDgml"); } catch (Exception ex) { _package.LogError(new List <string>(), ex); } }
public void ExportServerDatabaseTo40(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } var databaseInfo = menuItem.CommandParameter as DatabasesMenuCommandParameters; if (databaseInfo == null) { return; } var treeViewItem = databaseInfo.DatabasesTreeViewItem; try { DataSource sqlDataSource = new DataSource("MicrosoftSqlServer", "Microsoft SQL Server"); sqlDataSource.Providers.Add(DataProvider.SqlDataProvider); DataConnectionDialog dcd = new DataConnectionDialog(); dcd.DataSources.Add(sqlDataSource); dcd.SelectedDataProvider = DataProvider.SqlDataProvider; dcd.SelectedDataSource = sqlDataSource; if (DataConnectionDialog.Show(dcd) == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(dcd.ConnectionString)) { PickTablesDialog ptd = new PickTablesDialog(); int totalCount = 0; using (IRepository repository = RepoHelper.CreateServerRepository(dcd.ConnectionString)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } ptd.Owner = Application.Current.MainWindow; bool?res = ptd.ShowDialog(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { string sdfName; SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Export as"; fd.Filter = "SQL Server Compact Database (*.sdf)|*.sdf|All Files(*.*)|*.*"; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { sdfName = fd.FileName; using (IRepository repository = RepoHelper.CreateServerRepository(dcd.ConnectionString)) { try { string scriptRoot = System.IO.Path.GetTempFileName(); string tempScript = scriptRoot + ".sqlce"; var generator = RepoHelper.CreateGenerator(repository, tempScript); generator.ExcludeTables(ptd.Tables); SetStatus("Scripting server database..."); generator.ScriptDatabaseToFile(Scope.SchemaData); SetStatus("Creating SQL Server Compact database..."); ISqlCeHelper helper = RepoHelper.CreateHelper(); string sdfConnectionString = string.Format("Data Source={0};Max Database Size=4091", sdfName); if (System.IO.File.Exists(sdfName)) { File.Delete(sdfName); } helper.CreateDatabase(sdfConnectionString); BackgroundWorker bw = new BackgroundWorker(); List <string> parameters = new List <string>(); parameters.Add(sdfConnectionString); parameters.Add(tempScript); parameters.Add(scriptRoot); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += (s, ea) => { try { if (ea.Error != null) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ea.Error)); } else { MessageBox.Show("Database successfully exported"); } } finally { bw.Dispose(); } }; bw.RunWorkerAsync(parameters); } catch (Exception ex) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ex)); } } } } dcd.Dispose(); } } catch (Exception ex) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ex)); } }
public void ScriptServerDatabase(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } Scope scope = (Scope)menuItem.Tag; var databaseInfo = menuItem.CommandParameter as DatabasesMenuCommandParameters; if (databaseInfo == null) { return; } var treeViewItem = databaseInfo.DatabasesTreeViewItem; try { DataSource sqlDataSource = new DataSource("MicrosoftSqlServer", "Microsoft SQL Server"); sqlDataSource.Providers.Add(DataProvider.SqlDataProvider); DataConnectionDialog dcd = new DataConnectionDialog(); dcd.DataSources.Add(sqlDataSource); dcd.SelectedDataProvider = DataProvider.SqlDataProvider; dcd.SelectedDataSource = sqlDataSource; if (DataConnectionDialog.Show(dcd) == System.Windows.Forms.DialogResult.OK) { string connectionString = dcd.ConnectionString; string fileName; PickTablesDialog ptd = new PickTablesDialog(); int totalCount = 0; using (IRepository repository = RepoHelper.CreateServerRepository(dcd.ConnectionString)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } ptd.Owner = Application.Current.MainWindow; bool?res = ptd.ShowDialog(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Save generated database script as"; fd.Filter = "SQL Server Compact Script (*.sqlce)|*.sqlce|SQL Server Script (*.sql)|*.sql|All Files(*.*)|*.*"; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { fileName = fd.FileName; using (IRepository repository = RepoHelper.CreateServerRepository(connectionString)) { var generator = RepoHelper.CreateGenerator(repository, fd.FileName); generator.ExcludeTables(ptd.Tables); System.Windows.Forms.MessageBox.Show(generator.ScriptDatabaseToFile(scope)); } } } } dcd.Dispose(); } catch (Exception ex) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ex)); } }
public void GenerateServerDgmlFiles(object sender, ExecutedRoutedEventArgs e) { // http://www.mztools.com/articles/2007/MZ2007011.aspx var menuItem = sender as MenuItem; if (menuItem == null) { return; } var databaseInfo = menuItem.CommandParameter as DatabasesMenuCommandParameters; if (databaseInfo == null) { return; } var treeViewItem = databaseInfo.DatabasesTreeViewItem; bool originalValue = Properties.Settings.Default.KeepServerSchemaNames; try { DataSource sqlDataSource = new DataSource("MicrosoftSqlServer", "Microsoft SQL Server"); sqlDataSource.Providers.Add(DataProvider.SqlDataProvider); DataConnectionDialog dcd = new DataConnectionDialog(); dcd.DataSources.Add(sqlDataSource); dcd.SelectedDataProvider = DataProvider.SqlDataProvider; dcd.SelectedDataSource = sqlDataSource; if (DataConnectionDialog.Show(dcd) == System.Windows.Forms.DialogResult.OK) { string connectionString = dcd.ConnectionString; string fileName; PickTablesDialog ptd = new PickTablesDialog(); int totalCount = 0; using (IRepository repository = RepoHelper.CreateServerRepository(dcd.ConnectionString)) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } ptd.Owner = Application.Current.MainWindow; bool?res = ptd.ShowDialog(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Save generated DGML file as"; fd.Filter = "DGML (*.dgml)|*.dgml"; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { Properties.Settings.Default.KeepServerSchemaNames = true; fileName = fd.FileName; #if V35 using (IRepository repository = new ServerDBRepository(connectionString, Properties.Settings.Default.KeepServerSchemaNames)) #else using (IRepository repository = new ServerDBRepository4(connectionString, Properties.Settings.Default.KeepServerSchemaNames)) #endif { var generator = RepoHelper.CreateGenerator(repository, fileName); generator.GenerateSchemaGraph(connectionString, ptd.Tables); MessageBox.Show(string.Format("Saved {0}", fileName)); } } } dcd.Dispose(); } } catch (Exception ex) { MessageBox.Show(Helpers.DataConnectionHelper.ShowErrors(ex)); } finally { Properties.Settings.Default.KeepServerSchemaNames = originalValue; } }
public void GenerateServerDgmlFiles(object sender, ExecutedRoutedEventArgs e) { // http://www.mztools.com/articles/2007/MZ2007011.aspx var menuItem = sender as MenuItem; if (menuItem == null) { return; } var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters; if (databaseInfo == null) { return; } var originalValue = Properties.Settings.Default.KeepSchemaNames; try { var connectionString = databaseInfo.DatabaseInfo != null ? databaseInfo.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(_package); if (string.IsNullOrEmpty(connectionString)) { return; } var ptd = new PickTablesDialog(false); using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (res.HasValue && res.Value) { var fd = new SaveFileDialog(); fd.Title = "Save generated DGML file as"; fd.Filter = "DGML (*.dgml)|*.dgml"; fd.OverwritePrompt = true; fd.ValidateNames = true; var result = fd.ShowDialog(); if (!result.HasValue || result.Value != true) { return; } Properties.Settings.Default.KeepSchemaNames = true; var fileName = fd.FileName; using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { try { var generator = DataConnectionHelper.CreateGenerator(repository, fileName, DatabaseType.SQLServer); generator.GenerateSchemaGraph(connectionString, ptd.Tables); ThreadHelper.JoinableTaskFactory.Run(() => VS.Documents.OpenAsync(fileName)); DataConnectionHelper.LogUsage("DatabasesScriptDGML"); } catch (Exception ex) { DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } } } } catch (Exception ex) { DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } finally { Properties.Settings.Default.KeepSchemaNames = originalValue; } }
private void ExportServerDatabaseToEmbedded(DatabaseType databaseType, DatabaseMenuCommandParameters parameters) { string filter = DataConnectionHelper.GetSqlCeFileFilter(); Scope scope = Scope.SchemaData; if (databaseType == DatabaseType.SQLite) { filter = DataConnectionHelper.GetSqliteFileFilter(); scope = Scope.SchemaDataSQLite; } Debug.Assert(databaseType == DatabaseType.SQLite || databaseType == DatabaseType.SQLCE40, "Unexpected database type"); try { string connectionString = parameters.DatabaseInfo != null ? parameters.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(package); if (!string.IsNullOrEmpty(connectionString)) { PickTablesDialog ptd = new PickTablesDialog(); int totalCount = 0; using (IRepository repository = Helpers.DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } bool?res = ptd.ShowModal(); if (res.HasValue && res.Value == true && (ptd.Tables.Count < totalCount)) { string dbName; string dbConnectionString = null; SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Export as"; fd.Filter = filter; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { dbName = fd.FileName; try { if (databaseType == DatabaseType.SQLCE40) { package.SetStatus("Creating SQL Server Compact database..."); SqlCeScripting.SqlCeHelper4 helper = new SqlCeScripting.SqlCeHelper4(); dbConnectionString = string.Format("Data Source={0};Max Database Size=4091", dbName); if (System.IO.File.Exists(dbName)) { File.Delete(dbName); } helper.CreateDatabase(dbConnectionString); } if (databaseType == DatabaseType.SQLite) { package.SetStatus("Creating SQLite database..."); var helper = new SqliteHelper(); dbConnectionString = string.Format("Data Source={0};", dbName); if (System.IO.File.Exists(dbName)) { File.Delete(dbName); } helper.CreateDatabase(dbConnectionString); } BackgroundWorker bw = new BackgroundWorker(); List <object> workerParameters = new List <object>(); workerParameters.Add(dbConnectionString); workerParameters.Add(connectionString); workerParameters.Add(ptd.Tables); workerParameters.Add(databaseType.ToString()); workerParameters.Add(scope.ToString()); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += (s, ea) => { try { if (ea.Error != null) { Helpers.DataConnectionHelper.SendError(ea.Error, databaseType, false); } Helpers.DataConnectionHelper.LogUsage("DatabasesExportFromServer"); } finally { bw.Dispose(); } }; bw.RunWorkerAsync(workerParameters); } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, databaseType, false); } } } } } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLServer); } }
public void GenerateEfCoreModelInProject(object sender, ExecutedRoutedEventArgs e) { var databaseInfo = ValidateMenuInfo(sender); if (databaseInfo == null) { return; } var dbType = databaseInfo.DatabaseInfo.DatabaseType; var dte = package?.GetServiceHelper(typeof(DTE)) as DTE; if (dte == null) { return; } if (dte.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var dteH = new EnvDteHelper(); var project = dteH.GetProject(dte); if (project == null) { EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the EF Core Model to be placed"); return; } try { var ptd = new PickTablesDialog { IncludeTables = true }; using (var repository = DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, DatabaseType = databaseInfo.DatabaseInfo.DatabaseType })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var revEng = new EFCoreReverseEngineer.EfCoreReverseEngineer(); var classBasis = Path.GetFileNameWithoutExtension(databaseInfo.DatabaseInfo.Caption); if (dbType == DatabaseType.SQLServer) { classBasis = new SqlConnectionStringBuilder(databaseInfo.DatabaseInfo.ConnectionString).InitialCatalog; } var model = revEng.GenerateClassName(classBasis) + "Context"; var modelDialog = new EfCoreModelDialog { ModelName = model, ProjectName = project.Name, NameSpace = project.Properties.Item("DefaultNamespace").Value.ToString() }; var result = modelDialog.ShowModal(); if (!result.HasValue || result.Value != true) { return; } var projectPath = project.Properties.Item("FullPath").Value.ToString(); var options = new ReverseEngineerOptions { UseFluentApiOnly = !modelDialog.UseDataAnnotations, ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, ContextClassName = modelDialog.ModelName, DatabaseType = (EFCoreReverseEngineer.DatabaseType)dbType, ProjectPath = projectPath, OutputPath = modelDialog.OutputPath, ProjectRootNamespace = modelDialog.NameSpace, Tables = ptd.Tables }; var revEngResult = revEng.GenerateFiles(options); foreach (var filePath in revEngResult.FilePaths) { project.ProjectItems.AddFromFile(filePath); } if (revEngResult.FilePaths.Count > 0) { dte.ItemOperations.OpenFile(revEngResult.FilePaths.Last()); } ReportRevEngErrors(revEngResult, dteH.ContainsEfCoreReference(project, dbType)); DataConnectionHelper.LogUsage("DatabaseCreateEfCoreModel"); } catch (Exception ex) { DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false); } }
public void GenerateServerDgmlFiles(object sender, ExecutedRoutedEventArgs e) { // http://www.mztools.com/articles/2007/MZ2007011.aspx var menuItem = sender as MenuItem; if (menuItem == null) { return; } var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters; if (databaseInfo == null) { return; } bool originalValue = Properties.Settings.Default.KeepSchemaNames; var dte = package.GetServiceHelper(typeof(EnvDTE.DTE)) as EnvDTE.DTE; try { string connectionString = databaseInfo.DatabaseInfo != null ? databaseInfo.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(package); if (string.IsNullOrEmpty(connectionString)) { return; } string fileName; PickTablesDialog ptd = new PickTablesDialog(); using (IRepository repository = Helpers.DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } bool?res = ptd.ShowModal(); if (res.HasValue && res.Value == true) { SaveFileDialog fd = new SaveFileDialog(); fd.Title = "Save generated DGML file as"; fd.Filter = "DGML (*.dgml)|*.dgml"; fd.OverwritePrompt = true; fd.ValidateNames = true; bool?result = fd.ShowDialog(); if (result.HasValue && result.Value == true) { Properties.Settings.Default.KeepSchemaNames = true; fileName = fd.FileName; using (IRepository repository = Helpers.DataConnectionHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { try { var generator = Helpers.DataConnectionHelper.CreateGenerator(repository, fileName, DatabaseType.SQLServer); generator.GenerateSchemaGraph(connectionString, ptd.Tables); dte.ItemOperations.OpenFile(fileName); dte.ActiveDocument.Activate(); Helpers.DataConnectionHelper.LogUsage("DatabasesScriptDGML"); } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } } } } } catch (Exception ex) { Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } finally { Properties.Settings.Default.KeepSchemaNames = originalValue; } }
public void ScriptServerDatabase(object sender, ExecutedRoutedEventArgs e) { var menuItem = sender as MenuItem; if (menuItem == null) { return; } var scope = (Scope)menuItem.Tag; var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters; if (databaseInfo == null) { return; } try { //var serverList = new ObjectExplorerManager(_package).GetAllServers(); var connectionString = databaseInfo.DatabaseInfo != null ? databaseInfo.DatabaseInfo.ConnectionString : DataConnectionHelper.PromptForConnectionString(_package); if (string.IsNullOrEmpty(connectionString)) { return; } var ptd = new PickTablesDialog(); int totalCount; using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); totalCount = ptd.Tables.Count; } var res = ptd.ShowModal(); if (!res.HasValue || res.Value != true || (ptd.Tables.Count >= totalCount)) { return; } { var fd = new SaveFileDialog { Title = "Save generated script as", Filter = "SQL Server Compact Script (*.sqlce)|*.sqlce|SQL Server Script (*.sql)|*.sql|All Files(*.*)|*.*" }; if (scope == Scope.SchemaDataSQLite || scope == Scope.SchemaSQLite) { fd.Filter = "SQL Script (*.sql)|*.sql|All Files(*.*)|*.*"; } fd.OverwritePrompt = true; fd.ValidateNames = true; var result = fd.ShowDialog(); if (!result.HasValue || result.Value != true) { return; } using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer })) { try { var generator = DataConnectionHelper.CreateGenerator(repository, fd.FileName, DatabaseType.SQLServer); generator.ExcludeTables(ptd.Tables); EnvDteHelper.ShowMessage(generator.ScriptDatabaseToFile(scope)); DataConnectionHelper.LogUsage("DatabasesScriptServer"); } catch (Exception ex) { DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } } } } catch (Exception ex) { DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false); } }
public async void GenerateEfCoreModelInProject(object sender, ExecutedRoutedEventArgs e) { var databaseInfo = ValidateMenuInfo(sender); if (databaseInfo == null) { return; } var dbType = databaseInfo.DatabaseInfo.DatabaseType; var dte = package?.GetServiceHelper(typeof(DTE)) as DTE; if (dte == null) { return; } if (dte.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var dteH = new EnvDteHelper(); var project = dteH.GetProject(dte); if (project == null) { EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the EF Core Model to be placed"); return; } try { var ptd = new PickTablesDialog { IncludeTables = true }; using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo { ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, DatabaseType = databaseInfo.DatabaseInfo.DatabaseType })) { ptd.Tables = repository.GetAllTableNamesForExclusion(); } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var revEng = new EfCoreReverseEngineer(); var classBasis = Helpers.RepositoryHelper.GetClassBasis(databaseInfo.DatabaseInfo.ConnectionString, dbType); var model = revEng.GenerateClassName(classBasis) + "Context"; var packageResult = dteH.ContainsEfCoreReference(project, dbType); var modelDialog = new EfCoreModelDialog { InstallNuGetPackage = !packageResult.Item1, ModelName = model, ProjectName = project.Name, NameSpace = project.Properties.Item("DefaultNamespace").Value.ToString() }; var result = modelDialog.ShowModal(); if (!result.HasValue || result.Value != true) { return; } var projectPath = project.Properties.Item("FullPath").Value.ToString(); var options = new ReverseEngineerOptions { UseFluentApiOnly = !modelDialog.UseDataAnnotations, ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, ContextClassName = modelDialog.ModelName, DatabaseType = (EFCoreReverseEngineer.DatabaseType)dbType, ProjectPath = projectPath, OutputPath = modelDialog.OutputPath, ProjectRootNamespace = modelDialog.NameSpace, Tables = ptd.Tables }; var revEngResult = revEng.GenerateFiles(options); if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 2) { foreach (var filePath in revEngResult.EntityTypeFilePaths) { project.ProjectItems.AddFromFile(filePath); } } if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 1) { project.ProjectItems.AddFromFile(revEngResult.ContextFilePath); dte.ItemOperations.OpenFile(revEngResult.ContextFilePath); } packageResult = dteH.ContainsEfCoreReference(project, dbType); var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2; if (modelDialog.InstallNuGetPackage) { missingProviderPackage = null; } ReportRevEngErrors(revEngResult, missingProviderPackage); if (modelDialog.InstallNuGetPackage) { package.SetStatus("Installing EF Core provider package"); var nuGetHelper = new NuGetHelper(); await nuGetHelper.InstallPackageAsync(packageResult.Item2, project); } DataConnectionHelper.LogUsage("DatabaseCreateEfCoreModel"); } catch (Exception ex) { package.SetStatus(null); DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false); } }
public void GenerateServerDgmlFiles() { try { if (_package.Dte2.Mode == vsIDEMode.vsIDEModeDebug) { EnvDteHelper.ShowError("Cannot generate code while debugging"); return; } var databaseList = EnvDteHelper.GetDataConnections(_package); var psd = _package.GetView <IPickServerDatabaseDialog>(); psd.PublishConnections(databaseList.Select(m => new DatabaseConnectionModel { ConnectionName = m.Value.Caption, ConnectionString = m.Value.ConnectionString, DatabaseType = m.Value.DatabaseType })); var pickDataSourceResult = psd.ShowAndAwaitUserResponse(true); if (!pickDataSourceResult.ClosedByOK) { return; } _package.Dte2.StatusBar.Text = "Loading schema information..."; // Reload the database list, in case the user has added a new database in the dialog databaseList = EnvDteHelper.GetDataConnections(_package); DatabaseInfo dbInfo = null; if (pickDataSourceResult.Payload.Connection != null) { dbInfo = databaseList.Single(m => m.Value.ConnectionString == pickDataSourceResult.Payload.Connection?.ConnectionString).Value; } if (dbInfo == null) { // User didn't select a database, should be impossible, though return; } if (dbInfo.DatabaseType == DatabaseType.SQLCE35) { EnvDteHelper.ShowError($"Unsupported provider: {dbInfo.ServerVersion}"); return; } var ptd = new PickTablesDialog(); using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var ti = new List <TableInformation>(); var tables = repository.GetAllTableNamesForExclusion(); foreach (var table in tables) { ti.Add(TableInformation.Parse(table)); } ptd.Tables = ti; } var res = ptd.ShowModal(); if (!res.HasValue || !res.Value) { return; } var name = RepositoryHelper.GetClassBasis(dbInfo.ConnectionString, dbInfo.DatabaseType); var path = Path.Combine(Path.GetTempPath(), name + ".schema.dgml"); if (File.Exists(path)) { File.SetAttributes(path, FileAttributes.Normal); } using (var repository = RepositoryHelper.CreateRepository(dbInfo)) { var generator = RepositoryHelper.CreateGenerator(repository, path, dbInfo.DatabaseType); generator.GenerateSchemaGraph(dbInfo.ConnectionString, ptd.Tables.Select(m => m.UnsafeFullName).ToList()); File.SetAttributes(path, FileAttributes.ReadOnly); _package.Dte2.ItemOperations.OpenFile(path); _package.Dte2.ActiveDocument.Activate(); } Telemetry.TrackEvent("PowerTools.GenerateSchemaDgml"); } catch (Exception ex) { _package.LogError(new List <string>(), ex); } }