Přizpůsobení chování odstranění
Odstranění prvku obvykle způsobí také odstranit související prvky.Všechny relace připojené a jsou odstraněny všechny podřízené prvky.Toto chování se nazývá Odstranit šíření.Můžete přizpůsobit šíření odstranit, chcete-li například uspořádat tak, že další související prvky odstraněny.Psaní kódu programu, můžete provést, odstraňte šíření závisí na stavu modelu.Může také způsobit další změny v reakci na odstranění.
Toto téma obsahuje následující oddíly:
Výchozí chování odstranění
Nastavení možnosti rozšíření odstranit role
Potlačení uzavření odstranit – použijte tuto techniku, kde odstranění, povedou k odstranění sousedními prvky.
Pomocí OnDeleting a OnDeleted – pomocí těchto metod, kde odpověď může zahrnovat jiné akce, například aktualizovat hodnotu uvnitř nebo vně úložiště.
Odstranění pravidla – použití pravidla k šíření aktualizací jakéhokoli druhu v úložišti, kde by mohlo vést jednu změnu ostatním.
Odstranění události – události použití úložiště k šíření aktualizací mimo úložiště, například do jiných Visual Studio dokumentů.
Oddělit – který podřízený prvek připojen k nadřazené operaci sloučení vrátit zpět pomocí operace oddělit.
Výchozí chování odstranění
Ve výchozím nastavení platí následující pravidla odstranit šíření:
Pokud je prvek odstraněn, jsou odstraněny také všechny vložené prvky.Vložené prvky jsou ty, které jsou cíle vložení vztahů, pro které je tento prvek zdroj.Například pokud vkládání vztah z alba na skladbu, pak při odstranění určité Album všechny skladby budou odstraněny také.
Odstranění skladbu naopak neodstraní alba.
Standardně nejsou rozšířena odstranění podél referenční vztahy.Pokud je vztah referenční ArtistPlaysOnAlbum z alba na interpreta, odstranění alba neodstraní žádné související interpreta a odstranění interpreta neodstraní žádné album.
Odstranění však rozšířit podél některé předdefinované vztahy.Například při odstranění prvku modelu jeho obrazec v diagramu je také odstraněn.Prvek a tvar se vztahují PresentationViewsSubject referenční vztah.
Každý vztah, který je připojen k prvku, buď na roli zdroj nebo cíl je odstraněn.Vlastnosti role prvek na opačnou roli již obsahuje odstraněné prvek.
Nastavení možnosti rozšíření odstranit role
Může způsobit odstranění rozšíření podél vztah odkaz nebo z vložené dítěte k nadřazené.
Šíření odstranit nastavení
Vyberte v diagramu definice DSL role na který chcete odstranit šíření.Role je reprezentován řádek vlevo nebo vpravo od pole vztah domény.
Například pokud chcete zadat, že při každém odstranění alba, související interpreti jsou také odstraněny a vyberte roli připojen k doméně třídy interpreta.
V okně vlastnosti nastavena Šíří odstranit vlastnost.
Stisknutím klávesy F5 a ověřte, zda:
Při odstranění instance tohoto vztahu budou odstraněny také prvek na vybrané role.
Při odstranění prvku na opačnou roli instancí tohoto vztahu budou odstraněny a souvisejících prvků v této roli budou odstraněny.
Můžete také zobrazit Šíří odstranit volbu v Podrobnosti DSL okna.Vyberte třídu domény a otevřete v okně Detaily DSL Odstranit chování stránku klepnutím na tlačítko na straně okna.Rozšíření možnost je zobrazena pro opačnou roli každý vztah.Odstranit styl sloupec udává, zda rozšíření možnost je na její výchozí nastavení, ale nemá žádné zvláštní efekt.
Odstranit šíření pomocí programového kódu
Volby v souboru definice DSL pouze umožňují zvolit, zda odstranění rozšíří na okamžité souseda.Chcete-li provádět složitější schéma šíření delete můžete zapsat kód programu.
[!POZNÁMKA]
Chcete-li přidat kód programu DSL definition, vytvořit samostatný kód souboru v Dsl projektu a Částečná definice tříd ve složce generovaný kód posílit zápisu.Další informace naleznete v tématu Zápis kódu nastavit domény specifické pro jazyk.
Definování odstranit uzavření
Operace odstranění používá třídu YourModelDeleteClosure určit, které prvky odstranit dané počáteční výběr.Zavolá ShouldVisitRelationship() a ShouldVisitRolePlayer() opakovaně chodí grafu vztahy.Tyto metody lze přepsat.ShouldVisitRolePlayer je součástí propojení a prvek na jedné z rolí na odkaz.Má vrátit jednu z následujících hodnot:
VisitorFilterResult.Yes– Prvek by odstraněn a walker by měla pokračovat v akci prvek pro další odkazy.
VisitorFilterResult.DoNotCare– Prvek by měl odstranit, pokud jiný dotaz odpoví, že mají být odstraněny.
VisitorFilterResult.Never– Prvek nesmí být odstraněno, i když jiný dotaz odpovědi Yes, a walker se pokuste není prvek pro další odkazy.
// 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);
}
}
}
Uzavření technika zajišťuje, že sadu prvků a odkazy, které mají být odstraněny se stanoví před začátkem odstranění.Walker také kombinuje výsledky vašeho uzavření s těmi z jiných částí modelu.
Technika však předpokládá, že odstranění ovlivní pouze jeho okolí v grafu vztahy: tuto metodu nelze použít k odstranění prvku v jiné části modelu.Jej nelze použít, pokud chcete přidat prvky nebo jiné změny v reakci na odstranění.
Pomocí OnDeleting a OnDeleted
Můžete přepsat OnDeleting() nebo OnDeleted() v doméně třídy nebo ve vztahu k doméně.
OnDeletingje volána, když prvek má být odstraněn, ale před jeho vztahy byly odpojeny.Je stále splavných do a z dalších prvků a je stále v store.ElementDirectory.
Pokud současně odstranění několika prvků, se nazývá OnDeleting jim před provedením odstranění.
IsDeletingje PRAVDA.
OnDeletedje volána prvek byl odstraněn.Zůstává haldy CLR, takže vrácení zpět lze provést, pokud je to nutné, ale je nepropojené od jiných prvků a z store.ElementDirectory.Pro vztahy role stále referenční staré aktérů role.IsDeleted is true.
Pokud uživatel vyvolá zpět po vytvoření prvku a je znovu opakovat starší odstranění se nazývají OnDeleting a OnDeleted.Použití this.Store.InUndoRedoOrRollback , aby aktualizace úložiště prvků v těchto případech.Další informace naleznete v tématu Jak: použití transakcí aktualizace modelu.
Následující kód například odstraní při odstranění podřízených poslední skladba alba:
// 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();
} } } }
Je často užitečné k aktivační události z odstranění vztah než prvek roli protože to funguje, jak je prvek odstraněn a samotná relace bude odstraněna.Ve vztahu k referenční můžete však rozšířit odstranění souvisejících prvek odstraněn, ale není odstraněn samotnou relaci.Tento příklad odstraní Album je odstraněn jeho poslední přispívající interpreta, ale neodpovídá vztahy jsou odstraněny:
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();
} } }
Při Delete na prvku, se nazývá OnDeleting a OnDeleted.Tyto metody jsou vždy provedeny vložené –, bezprostředně před a po odstranění skutečné.Pokud kód odstraní dvě nebo více prvků, OnDeleting a OnDeleted bude volat v alternace na všech těchto zase.
Odstranění pravidla a události
Jako alternativu k OnDelete obsluhy můžete definovat pravidla odstranění a odstranění události.
Deletinga Delete pravidla budou spuštěna pouze v transakci a není v zpět nebo znovu.Můžete nastavit jejich spuštění na konci transakce, v němž se provádí odstranění ve frontě.Odstranění pravidla jsou vždy provedeny před odstraněných pravidla, která jsou ve frontě.
Pomocí pravidel můžete rozšířit změny, které ovlivní pouze prvky v úložišti, včetně vztahů, prvky diagramu a jejich vlastnosti.Obvykle pravidlo odstranění slouží k šíření odstranění a odstranit pravidlo vytvořit náhradní prvky a vztahy.
Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Deletedúložiště událost je vyvolána na konci transakce a je volána po zpět nebo znovu.Lze tedy použít k odstranění objektů mimo úložiště souborů, položek databáze nebo jiných objektů v šíření Visual Studio.
Další informace naleznete v tématu Obslužné rutiny událostí rozšířit změny mimo modelu.
Upozornění Při odstranění prvku přístup jeho hodnoty vlastností domény, ale nelze procházet odkazy vztah.Pokud Odstraněná událost na relaci, dostanete také dva prvky, které byly jeho role přehrávače.Pokud chcete reagovat na odstranění prvku modelu, ale má přístup k prvku, který byl propojen, tedy nastavte událost delete na vztahu namísto třídy prvku modelu domény.
Příklad odstranění pravidla
[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();
}
}
Příklad odstranění události
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);
}
}
}
Oddělit
Operace spojující podřízeného prvku nadřazeného se nazývá korespondence.Situace, kdy nový prvek nebo skupiny prvků vytvořených z panelu nástrojů nebo přesunut z jiné části modelu nebo zkopírovány ze schránky.Stejně jako vytváření vkládání vztah mezi nadřazenou a podřízenou nové operace sloučení lze také nastavit další vztahy pomocné prvky vytvořit a nastavit hodnoty vlastností v prvcích.Operace sloučení je zapouzdřen v prvku korespondence směrnice (EMD).
EMD také zapouzdřuje doplňkovou oddělit nebo MergeDisconnect operace.Máte-li cluster prvky pomocí sloučení bylo vyrobeno, je vhodné pomocí přidruženého oddělit odebrat prvek, pokud chcete ponechat zbývajících prvků v konzistentním stavu.Operace oddělit bude obvykle použijte postupy popsané v předchozích částech.
Další informace naleznete v tématu Přizpůsobení vytvoření prvku a pohyb.
Viz také
Koncepty
Přizpůsobení vytvoření prvku a pohyb