protected override bool ProcessCreateOrDeleteChange(EditingContext ctx, ModelToExplorerModelXRef xref, EfiChange change) { var artifact = change.Changed as EFArtifact; var conceptualModel = change.Changed as ConceptualEntityModel; var storageModel = change.Changed as StorageEntityModel; var mappingModel = change.Changed as MappingModel; if (null != artifact || null != conceptualModel || null != storageModel || null != mappingModel) { // reset the search results - they will no longer be valid // once the view model is recalculated below var explorerSearchResults = ExplorerSearchResults.GetExplorerSearchResults(ctx); explorerSearchResults.Reset(); // reload the UI - the ExplorerViewModelChanged will be fired // allowing the frame to rebind CreateViewModel(ctx); // don't process any more return(false); } var efElement = change.Changed as EFElement; // ExplorerViewModelHelper only needs to process EFElement changes // (others are DefaultableValue and SingleItemBinding - but // ExplorerViewModel does not currently need to map these latter) if (null != efElement) { var parent = efElement.Parent as EFElement; Debug.Assert( null != parent, "received changed element of type " + change.Changed.GetType().FullName + " with non-EFElement parent of type " + (efElement.Parent == null ? "NULL" : efElement.Parent.GetType().FullName)); if (null != parent) { // special case changing of an entity's key // If we are creating/deleting a Key PropertyRef then we need // to update the underlying ExplorerProperty var propRef = efElement as PropertyRef; var keyElement = efElement as Key; if (propRef != null) { keyElement = propRef.GetParentOfType(typeof(Key)) as Key; if (keyElement != null && null != propRef.Name && null != propRef.Name.Target) { ExplorerEFElement explorerProp = xref.GetExisting(propRef.Name.Target) as ExplorerProperty; if (null != explorerProp) { explorerProp.OnModelPropertyChanged(ExplorerEFElement.IsKeyPropertyID); } } } else if (keyElement != null) { // key must be a child of an entity var et = parent as EntityType; if (et != null) { // the key is being created or completely removed, so sync up every property foreach (var prop in et.Properties()) { ExplorerEFElement explorerProp = xref.GetExisting(prop) as ExplorerProperty; if (null != explorerProp) { explorerProp.OnModelPropertyChanged(ExplorerEFElement.IsKeyPropertyID); } } } } else { // find Explorer node which maps to the model's parent // this can be null is the ViewModel does not map the // parent object if (typeof(FunctionImport) == efElement.GetType()) { // the FunctionImport Explorer Parent node has been decided to be the ConceptualEntityModel ExplorerEFElement // rather than the ConceptualEntityContainer one which we would more naturally use to match the model setup parent = parent.Parent as EFElement; } var explorerParentItem = xref.GetExisting(parent); if (null != explorerParentItem) { // now find the Explorer node which should be the new/deleted ViewModel element's parent // (may not be the same as above due to Explorer ghost nodes) explorerParentItem = explorerParentItem.GetParentNodeForElement(efElement); if (EfiChange.EfiChangeType.Create == change.Type) { // It's possible that between the Create of a parent and its child // the Children property is called on the parent which loads the // child into the parent, even though the child is being added with // change.Type = Create. For safety, we should remove the existing // child (if it exists) so as to ensure any changes in the child change // are reflected. var explorerEFElement = xref.GetExisting(efElement); if (explorerEFElement != null) { explorerParentItem.RemoveChildIfLoaded(efElement); } explorerParentItem.InsertChildIfLoaded(efElement); } else { explorerParentItem.RemoveChildIfLoaded(efElement); } } } } } return(true); }
protected override bool ProcessCreateOrDeleteChange(EditingContext ctx, ModelToExplorerModelXRef xref, EfiChange change) { var artifact = change.Changed as EFArtifact; var conceptualModel = change.Changed as ConceptualEntityModel; var storageModel = change.Changed as StorageEntityModel; var mappingModel = change.Changed as MappingModel; if (null != artifact || null != conceptualModel || null != storageModel || null != mappingModel) { // reset the search results - they will no longer be valid // once the view model is recalculated below var explorerSearchResults = ExplorerSearchResults.GetExplorerSearchResults(ctx); explorerSearchResults.Reset(); // reload the UI - the ExplorerViewModelChanged will be fired // allowing the frame to rebind CreateViewModel(ctx); // don't process any more return false; } var efElement = change.Changed as EFElement; // ExplorerViewModelHelper only needs to process EFElement changes // (others are DefaultableValue and SingleItemBinding - but // ExplorerViewModel does not currently need to map these latter) if (null != efElement) { var parent = efElement.Parent as EFElement; Debug.Assert( null != parent, "received changed element of type " + change.Changed.GetType().FullName + " with non-EFElement parent of type " + (efElement.Parent == null ? "NULL" : efElement.Parent.GetType().FullName)); if (null != parent) { // special case changing of an entity's key // If we are creating/deleting a Key PropertyRef then we need // to update the underlying ExplorerProperty var propRef = efElement as PropertyRef; var keyElement = efElement as Key; if (propRef != null) { keyElement = propRef.GetParentOfType(typeof(Key)) as Key; if (keyElement != null && null != propRef.Name && null != propRef.Name.Target) { ExplorerEFElement explorerProp = xref.GetExisting(propRef.Name.Target) as ExplorerProperty; if (null != explorerProp) { explorerProp.OnModelPropertyChanged(ExplorerEFElement.IsKeyPropertyID); } } } else if (keyElement != null) { // key must be a child of an entity var et = parent as EntityType; if (et != null) { // the key is being created or completely removed, so sync up every property foreach (var prop in et.Properties()) { ExplorerEFElement explorerProp = xref.GetExisting(prop) as ExplorerProperty; if (null != explorerProp) { explorerProp.OnModelPropertyChanged(ExplorerEFElement.IsKeyPropertyID); } } } } else { // find Explorer node which maps to the model's parent // this can be null is the ViewModel does not map the // parent object if (typeof(FunctionImport) == efElement.GetType()) { // the FunctionImport Explorer Parent node has been decided to be the ConceptualEntityModel ExplorerEFElement // rather than the ConceptualEntityContainer one which we would more naturally use to match the model setup parent = parent.Parent as EFElement; } var explorerParentItem = xref.GetExisting(parent); if (null != explorerParentItem) { // now find the Explorer node which should be the new/deleted ViewModel element's parent // (may not be the same as above due to Explorer ghost nodes) explorerParentItem = explorerParentItem.GetParentNodeForElement(efElement); if (EfiChange.EfiChangeType.Create == change.Type) { // It's possible that between the Create of a parent and its child // the Children property is called on the parent which loads the // child into the parent, even though the child is being added with // change.Type = Create. For safety, we should remove the existing // child (if it exists) so as to ensure any changes in the child change // are reflected. var explorerEFElement = xref.GetExisting(efElement); if (explorerEFElement != null) { explorerParentItem.RemoveChildIfLoaded(efElement); } explorerParentItem.InsertChildIfLoaded(efElement); } else { explorerParentItem.RemoveChildIfLoaded(efElement); } } } } } return true; }