public override void OnActivated() { base.OnActivated(); _onWorkflowCleanup = false; Debug.Assert( !Wizard.MovingNext || _workflowInstance == null, "Possible memory leak: We should have destroyed the old workflow instance when activating WizardPageDbGenSummary"); if (_workflowInstance == null) { if (LocalDataUtil.IsSqlMobileConnectionString(Wizard.ModelBuilderSettings.DesignTimeProviderInvariantName)) { _ddlFileExtension = DatabaseGenerationEngine._sqlceFileExtension; } else { _ddlFileExtension = DatabaseGenerationEngine._ddlFileExtension; } // Add in the DbConfig page before if we have found a connection if (Wizard.Mode == ModelBuilderWizardForm.WizardMode.PerformDBGenSummaryOnly && _addedDbConfigPage == false) { Wizard.InsertPageBefore(Id, new WizardPageDbConfig(Wizard)); _addedDbConfigPage = true; } // Display the default path for the DDL var artifactProjectItem = VsUtils.GetProjectItemForDocument( Wizard.ModelBuilderSettings.Artifact.Uri.LocalPath, PackageManager.Package); if (artifactProjectItem != null) { txtSaveDdlAs.Text = DatabaseGenerationEngine.CreateDefaultDdlFileName(artifactProjectItem) + _ddlFileExtension; } // Disable all buttons except for Previous and Cancel Wizard.EnableButton(ButtonType.Previous, true); Wizard.EnableButton(ButtonType.Next, false); Wizard.EnableButton(ButtonType.Finish, false); Wizard.EnableButton(ButtonType.Cancel, true); // Display a status message ShowStatus(Properties.Resources.DbGenSummary_StatusDeterminingDDL); // Extract the XML from the EDMX file and convert it into an EdmItemCollection for the workflow EdmItemCollection edm = null; using (new VsUtils.HourglassHelper()) { IList <EdmSchemaError> schemaErrors; edm = Wizard.ModelBuilderSettings.Artifact.GetEdmItemCollectionFromArtifact(out schemaErrors); Debug.Assert( edm != null && schemaErrors.Count == 0, "EdmItemCollection schema errors found; we should have performed validation on the EdmItemCollection before instantiating the wizard."); } var existingSsdl = Wizard.ModelBuilderSettings.Artifact.GetSsdlAsString(); var existingMsl = Wizard.ModelBuilderSettings.Artifact.GetMslAsString(); // Attempt to get the workflow path, template path, and database schema name from the artifact. If we don't find them, we'll use defaults. var workflowPath = DatabaseGenerationEngine.GetWorkflowPathFromArtifact(Wizard.ModelBuilderSettings.Artifact); var templatePath = DatabaseGenerationEngine.GetTemplatePathFromArtifact(Wizard.ModelBuilderSettings.Artifact); var databaseSchemaName = DatabaseGenerationEngine.GetDatabaseSchemaNameFromArtifact(Wizard.ModelBuilderSettings.Artifact); // Save off the SynchronizationContext so we can post methods to the UI event queue when // responding to workflow events (since they are executed in a separate thread) _synchronizationContext = SynchronizationContext.Current; // Invoke the Pipeline/Workflow. The Workflow engine will automatically wrap this in a background thread try { using (new VsUtils.HourglassHelper()) { var resolvedWorkflowFileInfo = DatabaseGenerationEngine.ResolveAndValidateWorkflowPath( Wizard.Project, workflowPath); var resolvedDefaultPath = VsUtils.ResolvePathWithMacro( null, DatabaseGenerationEngine.DefaultWorkflowPath, new Dictionary <string, string> { { ExtensibleFileManager.EFTOOLS_USER_MACRONAME, ExtensibleFileManager.UserEFToolsDir.FullName }, { ExtensibleFileManager.EFTOOLS_VS_MACRONAME, ExtensibleFileManager.VSEFToolsDir.FullName } }); // Display a security warning if the workflow path specified is different from the default if (!resolvedWorkflowFileInfo.FullName.Equals( Path.GetFullPath(resolvedDefaultPath), StringComparison.OrdinalIgnoreCase)) { var displayCustomWorkflowWarning = true; try { var customWorkflowWarningString = EdmUtils.GetUserSetting(RegKeyNameCustomWorkflowWarning); if (false == String.IsNullOrEmpty(customWorkflowWarningString) && false == Boolean.TryParse(customWorkflowWarningString, out displayCustomWorkflowWarning)) { displayCustomWorkflowWarning = true; } if (displayCustomWorkflowWarning) { var cancelledDuringCustomWorkflowWarning = DismissableWarningDialog .ShowWarningDialogAndSaveDismissOption( Resources.DatabaseCreation_CustomWorkflowWarningTitle, Resources.DatabaseCreation_WarningCustomWorkflow, RegKeyNameCustomWorkflowWarning, DismissableWarningDialog.ButtonMode.OkCancel); if (cancelledDuringCustomWorkflowWarning) { HandleError( String.Format( CultureInfo.CurrentCulture, Resources.DatabaseCreation_CustomWorkflowCancelled, resolvedWorkflowFileInfo.FullName), false); return; } } } catch (SecurityException e) { // We should at least alert the user of why this is failing so they can take steps to fix it. VsUtils.ShowMessageBox( Services.ServiceProvider, String.Format( CultureInfo.CurrentCulture, Resources.ErrorReadingWritingUserSetting, RegKeyNameCustomWorkflowWarning, e.Message), OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_WARNING); } } _workflowInstance = DatabaseGenerationEngine.CreateDatabaseScriptGenerationWorkflow( _synchronizationContext, Wizard.Project, Wizard.ModelBuilderSettings.Artifact.Uri.LocalPath, resolvedWorkflowFileInfo, templatePath, edm, existingSsdl, existingMsl, databaseSchemaName, Wizard.ModelBuilderSettings.InitialCatalog, Wizard.ModelBuilderSettings.RuntimeProviderInvariantName, Wizard.ModelBuilderSettings.AppConfigConnectionString, Wizard.ModelBuilderSettings.ProviderManifestToken, Wizard.ModelBuilderSettings.Artifact.SchemaVersion, _workflowInstance_WorkflowCompleted, _workflowInstance_UnhandledException); } Wizard.ModelBuilderSettings.WorkflowInstance = _workflowInstance; _workflowInstance.Run(); } catch (Exception e) { HandleError(e.Message, true); if (_workflowInstance != null) { CleanupWorkflow(); } } } }
internal void TestPipeline( string testName, EdmItemCollection csdlInput, string workflowFilePath, Version versionOfCsdl, Func <WorkflowApplicationCompletedEventArgs, object> postInvokeCallback) { const string existingMsl = "<Mapping Space='C-S' xmlns='http://schemas.microsoft.com/ado/2008/09/mapping/cs'>" + " <EntityContainerMapping StorageEntityContainer='Model1StoreContainer' CdmEntityContainer='Model1Container' />" + "</Mapping>"; const string existingSsdl = "<Schema Namespace='Store' Alias='Self' Provider='System.Data.SqlClient' ProviderManifestToken='2005' xmlns='http://schemas.microsoft.com/ado/2006/04/edm/ssdl' />"; Exception savedException = null; var workflowCompleted = new AutoResetEvent(false); var completedHandler = new Action <WorkflowApplicationCompletedEventArgs>( e => { try { var result = (string)postInvokeCallback(e); Assert.AreEqual( TestUtils.LoadEmbeddedResource("EFDesigner.InProcTests.Baselines." + testName + ".bsl"), result); } catch (Exception ex) { // save off the exception, return out of the completion handler. If we throw here // the wrong thread will catch the exception savedException = ex; } finally { workflowCompleted.Set(); } } ); var unhandledExceptionHandler = new Func <WorkflowApplicationUnhandledExceptionEventArgs, UnhandledExceptionAction>( e => { if (e.UnhandledException != null) { Console.WriteLine(e.UnhandledException); savedException = e.UnhandledException; } workflowCompleted.Set(); return(UnhandledExceptionAction.Terminate); } ); var resolvedWorkflowFileInfo = DatabaseGenerationEngine.ResolveAndValidateWorkflowPath(null, workflowFilePath); var workflowInstance = DatabaseGenerationEngine.CreateDatabaseScriptGenerationWorkflow( null, null, null, resolvedWorkflowFileInfo, "$(VSEFTools)\\DBGen\\SSDLToSQL10.tt", csdlInput, existingSsdl, existingMsl, "dbo", "TestDb", "System.Data.SqlClient", null, "2005", versionOfCsdl, completedHandler, unhandledExceptionHandler); // Kick off the workflow workflowInstance.Run(); // Block this thread until the AutoResetEvent receives a signal for synchronous behavior (just in case) workflowCompleted.WaitOne(); // Check to see if an exception was set, if so, throw it so the test framework can handle it if (savedException != null) { throw savedException; } }