public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e) { base.ElementPropertyChanged(e); ModelRoot element = (ModelRoot)e.ModelElement; Store store = element.Store; Transaction current = store.TransactionManager.CurrentTransaction; if (current.IsSerializing) { return; } if (Equals(e.NewValue, e.OldValue)) { return; } List <string> errorMessages = EFCoreValidator.GetErrors(element).ToList(); bool redraw = false; switch (e.DomainProperty.Name) { case "ConnectionString": if (e.NewValue != null) { element.ConnectionStringName = null; } break; case "ConnectionStringName": if (e.NewValue != null) { element.ConnectionString = null; } break; case "DatabaseSchema": if (string.IsNullOrEmpty((string)e.NewValue)) { element.DatabaseSchema = "dbo"; } break; case "EntityFrameworkVersion": element.EntityFrameworkPackageVersion = "Latest"; if (element.EntityFrameworkVersion == EFVersion.EFCore) { element.InheritanceStrategy = CodeStrategy.TablePerHierarchy; } break; case "EnumOutputDirectory": if (string.IsNullOrEmpty((string)e.NewValue) && !string.IsNullOrEmpty(element.EntityOutputDirectory)) { element.EnumOutputDirectory = element.EntityOutputDirectory; } break; case "StructOutputDirectory": if (string.IsNullOrEmpty((string)e.NewValue) && !string.IsNullOrEmpty(element.EntityOutputDirectory)) { element.StructOutputDirectory = element.EntityOutputDirectory; } break; case "EntityOutputDirectory": if (string.IsNullOrEmpty(element.EnumOutputDirectory) || element.EnumOutputDirectory == (string)e.OldValue) { element.EnumOutputDirectory = (string)e.NewValue; } if (string.IsNullOrEmpty(element.StructOutputDirectory) || element.StructOutputDirectory == (string)e.OldValue) { element.StructOutputDirectory = (string)e.NewValue; } break; case "FileNameMarker": string newFileNameMarker = (string)e.NewValue; if (!Regex.Match($"a.{newFileNameMarker}.cs", @"^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\"";|/]+$") .Success) { errorMessages.Add("Invalid value to make part of file name"); } break; case "InheritanceStrategy": if ((element.EntityFrameworkVersion == EFVersion.EFCore) && (element.NuGetPackageVersion.MajorMinorVersionNum < 2.1)) { element.InheritanceStrategy = CodeStrategy.TablePerHierarchy; } break; case "LayoutAlgorithm": ModelDisplay.LayoutDiagram(element.Classes.FirstOrDefault()?.GetActiveDiagram() as EFModelDiagram); break; case "Namespace": errorMessages.Add(CommonRules.ValidateNamespace((string)e.NewValue, CodeGenerator.IsValidLanguageIndependentIdentifier)); break; case "ShowCascadeDeletes": // need these change rules to fire even though nothing in Association has changed // so we need to set this early -- requires guarding against recursion. bool newShowCascadeDeletes = (bool)e.NewValue; if (element.ShowCascadeDeletes != newShowCascadeDeletes) { element.ShowCascadeDeletes = newShowCascadeDeletes; foreach (Association association in store.ElementDirectory.FindElements <Association>()) { AssociationChangeRules.UpdateDisplayForCascadeDelete(association); } } redraw = true; break; case "ShowWarningsInDesigner": redraw = true; break; case "WarnOnMissingDocumentation": if (element.ShowWarningsInDesigner) { redraw = true; } ModelRoot.ExecuteValidator?.Invoke(); break; } errorMessages = errorMessages.Where(m => m != null).ToList(); if (errorMessages.Any()) { current.Rollback(); ErrorDisplay.Show(string.Join("\n", errorMessages)); } if (redraw) { element.InvalidateDiagrams(); } }
protected override void OnDocumentLoaded() { base.OnDocumentLoaded(); if (!(RootElement is ModelRoot modelRoot)) { return; } // set to the project's namespace if no namespace set if (string.IsNullOrEmpty(modelRoot.Namespace)) { using (Transaction tx = modelRoot.Store.TransactionManager.BeginTransaction("SetDefaultNamespace")) { DTE dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DTE)) as DTE; Project currentProject = GetActiveProject(dte); modelRoot.Namespace = currentProject.Properties.Item("DefaultNamespace")?.Value as string; tx.Commit(); } } ReadOnlyCollection <Association> associations = modelRoot.Store.ElementDirectory.FindElements <Association>(); if (associations.Any()) { using (Transaction tx = modelRoot.Store.TransactionManager.BeginTransaction("StyleConnectors")) { // style association connectors if needed foreach (Association element in associations) { AssociationChangeRules.UpdateDisplayForPersistence(element); AssociationChangeRules.UpdateDisplayForCascadeDelete(element); // for older diagrams that didn't calculate this initially AssociationChangeRules.SetEndpointRoles(element); } tx.Commit(); } } List <GeneralizationConnector> generalizationConnectors = modelRoot.Store .ElementDirectory .FindElements <GeneralizationConnector>() .Where(x => !x.FromShape.IsVisible || !x.ToShape.IsVisible) .ToList(); List <AssociationConnector> associationConnectors = modelRoot.Store .ElementDirectory .FindElements <AssociationConnector>() .Where(x => !x.FromShape.IsVisible || !x.ToShape.IsVisible) .ToList(); if (generalizationConnectors.Any() || associationConnectors.Any()) { using (Transaction tx = modelRoot.Store.TransactionManager.BeginTransaction("HideConnectors")) { // hide any connectors that may have been hidden due to hidden shapes foreach (GeneralizationConnector connector in generalizationConnectors) { connector.Hide(); } foreach (AssociationConnector connector in associationConnectors) { connector.Hide(); } tx.Commit(); } } }