Anpassen des Löschverhaltens
Das Löschen eines Elements wird normalerweise zugehörigen Elemente, ebenfalls gelöscht werden sollen.Alle Beziehungen schlossen an ihn an, und alle untergeordneten Elemente werden gelöscht.Dieses Verhalten ist Delete weitergabebenannt.weitergabe Löschen Sie können anpassen, z. B. um anzuordnen, dass zusätzliche zugehörigen Elemente gelöscht werden.Wenn Sie Programmcode schreiben, können Sie Delete Weitergabe vom Zustand des Modells abhängen.Sie können auch weitere Änderungen als Antwort auf ein Löschvorgang einzutreten.
Dieses Thema enthält die folgenden Abschnitte:
Nehmen Sie Löschen-Verhalten den Standardwert an
Das Festlegen dieser Option Weitergegebene Löschen einer Rolle
Durch Überschreiben Löschungs-Abschluss – Verwenden Sie dieses Verfahren, in der benachbarter Löschen von möglicherweise auf Abbrechen Elementen hat.
InnerhalbVerwenden OnDeleting und OnDeleted – Verwenden Sie diese Methoden, die die Antwort weitere Aktionen wie das Aktualisieren eines Werts entweder oder außerhalb des Speichers enthalten könnte.
Verwenden Sie steuern,Löschen-Regeln – Updates der Art innerhalb des Speichers beliebigen weiterzugeben, in dem eine Änderung an andere führte.
Verwenden SieLöschen-Ereignisse – Ereignisse auf, um Updates außerhalb des Arbeitsspeichers, z. B. Visual Studio anderen Dokumenten zu verteilen.
UnMerge – Verwenden Sie den UnMerge-Vorgang, um die Zusammenführung rückgängig zu machen, die ein untergeordnetes Element zu seinem übergeordneten Element angefügt haben.
Standardwert Löschen-Verhalten
Standardmäßig regeln den folgenden Regeln: weitergabe Löschen
Wenn ein Element gelöscht wird, werden alle eingebetteten Elemente ebenfalls gelöscht.Die eingebetteten Elemente sind diejenigen, die die Ziele von Einbettungs-Verhältnissen sind, für die dieses Element die Quelle ist.Wenn beispielsweise ein Einbettungs-Verhältnis von Album auf Lied gibt, dann, wenn ein bestimmtes Album gelöscht wird, alle seine Lieder ebenfalls gelöscht werden.
Der Gegensatz dazu ein Lied Deleting löscht nicht das Album.
Standardmäßig gibt Löschen nicht entlang Bezugs-Verhältnissen weiter.Wenn ein Bezugs-Verhältnis ArtistPlaysOnAlbum von Album auf den Künstler vorhanden sind, ein Album Deleting löscht keine zugehörigen Künstler, und einen Künstler gelöscht wird, löscht ein Album.
Es gibt einige integrierten Beziehungen auf Abbrechen.Wenn beispielsweise ein Modellelement gelöscht wird, wird seine Form im Diagramm ebenfalls gelöscht.Das Element und die Form werden vom PresentationViewsSubject Bezugs-Verhältnis verknüpft.
Jede Beziehung, das an das Element, an der Quell- oder Zielrolle verbunden ist, wird gelöscht.Die Rolle Eigenschaft des Elements auf der entgegengesetzten Rolle enthält nicht mehr das gelöschte Element.
Das Festlegen dieser Option Weitergegebene Löschen einer Rolle
Sie können bewirken, dass für einen Bezugs-Verhältnis löschen oder von einem eingebetteten untergeordneten Elemente weitergegeben werden zum übergeordneten Element.
So legen Sie weitergabe Löschen
Klicken Sie im Diagramm DSL-Definitions Wählen Sie die Rolle aus, für die Weitergabe löschen möchten.Die Rolle wird durch die Zeile am linken oder rechten eines Domänen-Verhältnis-Felds dargestellt.
Wenn Sie beispielsweise angeben möchten, dass immer dann, wenn ein Album gelöscht wird, werden die verknüpften Künstler auch dann gelöscht, die Rolle aus, die an den Domänenklasse Künstler verbunden ist.
Legen Sie im Eigenschaftenfenster die Gibt Löschen weiter-Eigenschaft fest.
Drücken Sie F5, und überprüfen Sie die:
Wenn eine Instanz dieses Beziehung gelöscht wurde, wird das Element in der ausgewählten Rolle ebenfalls gelöscht.
Wenn ein Element auf der entgegengesetzten Rolle gelöscht wird, werden Instanzen dieses Beziehung gelöscht, und die verwandten Elemente dieser Rolle gelöscht werden.
Sie können die Option Gibt Löschen weiterDSL-Details auch im Fenster anzuzeigen.Wählen Sie eine Domänenklasse im Fenster DSL-Detail, und öffnen Sie die Seite Verhalten löschen , indem Sie auf die Schaltfläche am oberen Rand des Fensters klicken.Die Weitergeben Option wird für die entgegengesetzte Rolle jede Beziehung angezeigt.Die Formatvorlagen löschen Spalte gibt an, ob die Option Weitergeben an der Standardeinstellung ist, jedoch hat keine separater Auswirkungen.
Löschungs-Weitergabe mithilfe von Programmcode
Die Optionen in der Datei DSL-Definitions nur können Sie auswählen, ob Löschvorgänge an einen unmittelbaren Nachbar weitergegeben wird.Um ein komplexeres Schema der Delete weitergabe zu implementieren, können Sie Programmcode schreiben.
Hinweis |
---|
Um DSL-Definition der Programmcode hinzufügen möchten, erstellen Sie eine separate Codedatei im Dsl Projekt, und schreiben Sie partielle Definitionen um die Klassen im generierten Codeordner zu erweitern.Weitere Informationen finden Sie unter Schreiben von Code zum Anpassen einer domänenspezifischen Sprache. |
Definieren eines Löschungs-Abschluss
Der Löschvorgang wird die Klasse TheModelDeleteClosure , um zu bestimmen, welche Elemente gelöscht werden sollen, wenn eine ursprüngliche Auswahl.Sie ruft ShouldVisitRelationship() und ShouldVisitRolePlayer() wiederholt aufgerufen und durchläuft das Diagramm anhand von Beziehungen.Sie können diese Methoden überschreiben.ShouldVisitRolePlayer wird mit der Identität eines Elements und des Links bei einer der Rollen des Links bereitgestellt.Sie muss einen der folgenden Werte zurückgeben:
VisitorFilterResult.Yes– Element sollte gelöscht und der Wanderer sollte weiterhin die anderen Links des Elements zu versuchen.
VisitorFilterResult.DoNotCare – Element sollte nicht gelöscht werden, es sei denn, eine andere Abfrage antwortet, dass sie gelöscht werden soll.
VisitorFilterResult.Never – Element darf erst gelöscht werden, selbst wenn eine andere Abfrage Yesbeantwortet, und der Wanderer sollte die anderen Links des Elements nicht.
// When a musician is deleted, delete their albums with a low rating.
// Override methods in <YourDsl>DeleteClosure in DomainModel.cs
partial class MusicLibDeleteClosure
{
public override VisitorFilterResult ShouldVisitRolePlayer
(ElementWalker walker, ModelElement sourceElement, ElementLink elementLink,
DomainRoleInfo targetDomainRole, ModelElement targetRolePlayer)
{
ArtistAppearsInAlbum link = elementLink as ArtistAppearsInAlbum;
if (link != null
&& targetDomainRole.RolePlayer.Id == Album.DomainClassId)
{
// Count other unvisited links to the Album of this link.
if (ArtistAppearsInAlbum.GetLinksToArtists(link.Album)
.Where(linkAlbumArtist =>
linkAlbumArtist != link &&
!walker.Visited(linkAlbumArtist))
.Count() == 0)
{
// Should delete this role player:
return VisitorFilterResult.Yes;
}
else
// Don’t delete unless another relationship deletes it:
return VisitorFilterResult.DoNotCare;
}
else
{
// Test for and respond to other relationships and roles here.
// Not the relationship or role we’re interested in.
return base.ShouldVisitRolePlayer(walker, sourceElement,
elementLink, targetDomainRole, targetRolePlayer);
}
}
}
Die Vervollständigung technik wird sichergestellt, dass der Satz der zu löschenden Elementen und Links bestimmt wird, bevor Löschvorgang startet.Der Wanderer auch kombiniert die Ergebnisse des Abschlusses mit denen von anderen Teilen des Modells.
Allerdings geht die Methode an, dass nur die Nachbarn im Diagramm Löschen von Beziehungen beeinflusst: Sie können diese Methode nicht verwenden, um ein Element in einem anderen Teil des Modells zu löschen.Sie können sie nicht verwenden, wenn Sie Elemente hinzufügen oder andere Änderungen als Antwort auf das Löschen vornehmen möchten.
Verwenden OnDeleting und OnDeleted
Sie können OnDeleting() oder OnDeleted() entweder in eine Domänenklasse oder in einem Domänen-Verhältnis überschreiben.
OnDeleting wird aufgerufen, wenn ein Element gerade gelöscht werden, bevor ihre Beziehungen getrennt wurden.Sie ist in und von anderen Elementen noch schiffbar und ist immer noch in store.ElementDirectory.
Wenn mehrere Elemente gleichzeitig gelöscht werden, wird OnDeleting für alle aufgerufen, bevor der Löschvorgang ausgeführt wird.
IsDeleting ist true.
OnDeleted wird aufgerufen, wenn das Element gelöscht wurde.Es bleibt im CLR-Heap, dass Undo nach Bedarf ausgeführt werden kann, wird jedoch von anderen Elementen gelöst und Entfernen von store.ElementDirectory.Für Beziehungen noch die Rollen verweisen die alte Rolle Spieler.IsDeleted ist true.
Nach dem Erstellen eines Elements, OnDeleting und OnDeleted werden aufgerufen, wenn der Benutzer den Befehl Rückgängig aus aufgerufen wird und wenn ein früher Löschen in wiederholt wird, überprüft.Verwendung this.Store.InUndoRedoOrRollback Speicher, Elemente in diesen Fällen zu aktualisieren.Weitere Informationen finden Sie unter Gewusst wie: Verwenden von Transaktionen zum Aktualisieren des Modells.
Der folgende Code löscht beispielsweise ein Album, wenn dessen letztes untergeordnetes Lied gelöscht wird:
// Delete the parent Album when the last Song is deleted.
// Override methods in the embedding relationship between Album and Song:
partial class AlbumHasSongs
{
protected override void OnDeleted()
{
base.OnDeleted();
// Don't perform in-store actions in undo:
if (this.Store.InUndoRedoOrRollback) return;
// Relationship source and target still work:
// Don't bother if source is already on its way out:
if (!this.Album.IsDeleting && !this.Album.IsDeleted)
{
if (this.Album.Songs.Count == 0)
{
this.Album.Delete();
} } } }
So starten Sie wird häufig nützlicher, dem Löschen der Beziehung als die Rolle Element, da dies funktioniert sowohl, wenn das Element gelöscht wird und wenn die Beziehung selbst gelöscht wird.Für ein Bezugs-Verhältnis, wünschten Sie dann löschen, wenn ein zugehöriges Element gelöscht wird, jedoch nicht, wenn die Beziehung selbst gelöscht wird.In diesem Beispiel wird ein Album, wenn der letzten beitragender Künstler gelöscht wird, reagiert jedoch nicht, wenn die Beziehungen gelöscht werden:
using System.Linq; ...
// Assumes a many-many reference relationship
// between Artist and Album.
partial class Artist
{
protected override void OnDeleting()
{
base.OnDeleting();
if (this.Store.InUndoRedoOrRollback) return;
List<Album> toDelete = new List<Album>();
foreach (Album album in this.Albums)
{
if (album.Artists.Where(artist => !artist.IsDeleting)
.Count() == 0)
{
toDelete.Add(album);
}
}
foreach (Album album in toDelete)
{
album.Delete();
} } }
Wenn Sie Delete für ein Element ausführen, werden OnDeleting und OnDeleted aufgerufen.Diese Methoden sind immer inline, d. h. unmittelbar vor und nach dem tatsächlichen Löschvorgänge ausgeführt.Wenn der Code zwei oder mehr Elemente gelöscht werden OnDeleting und OnDeleted in der Alternierung für alle wiederum aufgerufen.
Löschen-Regeln und Ereignisse
Als Alternative zu OnDelete-Handlern, können Sie Löschungen und Löschen von Regeln definieren.
Deleting und Delete Regeln sind nur in einer Transaktion gestartet und nicht in einem Rückgängig- oder wiederholen.Sie können in die Warteschlange gestellt werden soll sie fest, die am Ende der Transaktion auszuführen, in der der Löschvorgang ausgeführt wird.Löschen von Regeln werden immer vor allen gelöschten Regeln ausgeführt, die sich in der Warteschlange befinden.
Verwenden Sie steuern, Änderungen weiterzugeben, die nur Elemente im Speicher, einschließlich Beziehungen Diagrammelemente und ihre Eigenschaften beeinflussen.In der Regel wird eine zu löschende Regel, Löschen und verwendet dann eine Regel löschen wird, Ersetzung und - verhältnisse zu erstellen.
Weitere Informationen finden Sie unter Regeln propagieren Änderungen im Modell .
Deleted Speicher für Auswahlereignisse wird am Ende einer Transaktion aufgerufen und wird wiederholt aufgerufen, nachdem ein Rückgängig- oder legt diese fest.Sie kann daher verwendet werden, um Löschungen auf Objekte außerhalb des Speichers wie Dateien, Datenbanken oder andere Einträge für Objekte in Visual Studioweiterzugeben.
Weitere Informationen finden Sie unter Ereignishandler propagieren Änderungen außerhalb des Modells.
Vorsicht Wenn ein Element gelöscht wurde, können Sie deren Werte Domäneneigenschaften zugreifen, jedoch nicht Verhältnis-Links navigieren.Wenn Sie einen gelöschten Ereignis auf einer Beziehung, die Sie auch zwei Elemente zugreifen können, die ihre Rolle Player waren.Wenn Sie auf das Löschen eines Modellelements antworten jedoch ein Element zugreifen möchten, auf dem sie verknüpft wurde, legen Sie ein Ereignis zum Löschen des Verhältnisses anstelle der Domänenklasse des Modellelements fest.
Beispiels-Löschen-Regeln
[RuleOn(typeof(Album), FireTime = TimeToFire.TopLevelCommit)]
internal class AlbumDeletingRule : DeletingRule
{
public override void ElementDeleting(ElementDeletingEventArgs e)
{
base.ElementDeleting(e);
// ...perform tasks to propagate imminent deletion
}
}
[RuleOn(typeof(Album), FireTime = TimeToFire.TopLevelCommit)]
internal class AlbumDeletedRule : DeleteRule
{
public override void ElementDeleted(ElementDeletedEventArgs e)
{
base.ElementDeleted(e);
// ...perform tasks such as creating new elements
}
}
// The rule must be registered:
public partial class MusicLibDomainModel
{
protected override Type[] GetCustomDomainModelTypes()
{
List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
types.Add(typeof(AlbumDeletingRule));
types.Add(typeof(AlbumDeletedRule));
// If you add more rules, list them here.
return types.ToArray();
}
}
Beispiel für deaktiviertes Ereignis
partial class NestedShapesSampleDocData
{
protected override void OnDocumentLoaded(EventArgs e)
{
base.OnDocumentLoaded(e);
DomainRelationshipInfo commentRelationship =
this.Store.DomainDataDirectory
.FindDomainRelationship(typeof(CommentsReferenceComponents));
this.Store.EventManagerDirectory.ElementDeleted.Add(commentRelationship,
new EventHandler<ElementDeletedEventArgs>(CommentLinkDeleted));
}
private void CommentLinkDeleted (object sender, ElementDeletedEventArgs e)
{
CommentsReferenceComponents link = e.ModelElement as CommentsReferenceComponents;
Comment comment = link.Comment;
Component component = link.Subject;
if (comment.IsDeleted)
{
// The link was deleted because the comment was deleted.
System.Windows.Forms.MessageBox.Show("Removed comment on " + component.Name);
}
else
{
// It was just the link that was deleted - the comment itself remains.
System.Windows.Forms.MessageBox.Show("Removed comment link to "
+ component.Name);
}
}
}
UnMerge
Der Vorgang, bei dem es sich um ein untergeordnetes Element zu seinem übergeordneten Element angefügt wird, wird eine Zusammenführungaufgerufen.Sie tritt auf, wenn ein neues Element oder eine Gruppe von Elementen aus der Toolbox erstellt oder aus einem anderen Teil des Modells bewegt oder aus der Zwischenablage kopiert.Sowie das Erstellen eines Einbettungs-Verhältnisses zwischen dem übergeordneten Element und seinem neuen untergeordneten Elements, kann die Zusammenführung zusätzliche Beziehungen installieren, erstellt zusätzliche Elemente und Festlegen von Eigenschaftswerten in Elementen.Die Zusammenführung wird in Element-Merge-Direktiven (EMD) gekapselt.
Ein EMD kapselt auch das zusätzliche unmerge oder den MergeDisconnect Vorgang.Wenn Sie einen Cluster von Elementen verfügen, der erstellt wurde, indem eine Zusammenführung verwendet, ist es empfehlenswert, um das zugeordnete unmerge verwenden, um ein Element aus dieser zu entfernen, wenn Sie die verbleibenden Elemente in einem konsistenten Zustand belassen möchten.Der unmerge Vorgang verwendet in der Regel die Methoden beschrieben, die in den vorherigen Abschnitten beschrieben werden.
Weitere Informationen finden Sie unter Anpassen der Elementerstellung und -verschiebung.
Siehe auch
Konzepte
Anpassen der Elementerstellung und -verschiebung
Weitere Ressourcen
Schreiben von Code zum Anpassen einer domänenspezifischen Sprache