Sdílet prostřednictvím


Přizpůsobení chování odstranění

Odstraňování element obvykle způsobí, že související prvky, které mají být odstraněny také.Všechny vztahy k němu připojená, a budou odstraněny všechny podřízené prvky.Toto chování se nazývá odstranit šíření.Odstranění šíření, například zajistit, že budou odstraněny další související prvky lze přizpůsobit.Tím, že napíšeme program kódu, můžete si dělat šíření odstranění závisí na stav 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žnost šířit odstranit roli.

  • Přepsání uzavření odstranit – tuto metodu použít, kde odstranění může vést k odstranění sousedních elementy.

  • Pomocí OnDeleting a OnDeleted – pomocí těchto metod, které odpovědi mohou zahrnovat další akce, jako je aktualizace hodnotu uvnitř nebo vně úložiště.

  • Odstranění pravidla – pomocí pravidel šířit aktualizace jakéhokoli druhu v rámci úložiště, kde jednu změnu může vést k ostatním uživatelům.

  • Odstranění události – události úložiště použití šířit aktualizace mimo obchodu, například na navzájem Visual Studio dokumenty.

  • Oddělit – pomocí operace oddělit připojený k nadřazenému podřízený element operaci sloučení vrátit zpět.

Výchozí chování odstranění

Ve výchozím nastavení platí následující pravidla šíření odstranění:

  • Pokud je element odstraněn, budou odstraněny také všechny vložené prvky.Vložené prvky jsou ty, které jsou cíle vnoření relace, pro které tento element je zdroj.Například pokud je vnoření vztah z alba na skladbu, pak při odstranění určité Album všechny jeho skladeb budou také odstraněny.

    Naproti odstraňování skladbu nedojde k odstranění alba.

  • Ve výchozím nastavení odstranění nešíří podél referenční relace.Pokud je referenční vztah ArtistPlaysOnAlbum z alba do umělecké, odstranění album nedojde k odstranění všech souvisejících umělecké a odstranění umělci a přesto nedojde k odstranění všech alba.

    Odstranění však rozšířit podél některé integrované vztahy.Například při odstranění prvku modelu její tvar na diagramu je také odstraněn.Element a tvar se vztahují PresentationViewsSubject referenční vztah.

  • Každý vztah, který je připojen k elementu, buď na roli zdroje nebo cíle, je odstraněn.Vlastnost role elementu na opačnou role již obsahuje element odstraněn.

Nastavení možnost šířit odstranit roli.

Může způsobit odstranění šířit podél referenčního vztahu nebo z vložený podřízené jeho nadřazeným prvkem.

Chcete-li nastavit šíření odstranění hodnoty

  1. V definici DSL diagramu, vyberte možnost role na který se má šíření hodnoty k odstranění.Role je reprezentována řádku na levé straně nebo napravo od pole vztah domény.

    Například pokud chcete určit, že vždy, když je odstraněn Album, související umělců budou také odstraněny a potom vyberte roli připojen do domény třídy umělce.

  2. V okně vlastnosti nastavena šíří odstranit vlastnost.

  3. Stisknutím klávesy F5 a ověřte, zda:

    • Při odstranění instance tohoto vztahu budou odstraněny také element na vybrané roli.

    • Jestliže prvek na opačnou role odstraněna, instance tohoto vztahu budou odstraněny a související prvky v této roli budou odstraněny.

Můžete také zobrazit šíří odstranit možnost DSL podrobnosti okna.Vyberte třídu domény a v okně Detaily DSL otevřete odstranit chování stránky kliknutím na tlačítko na okraji okna.Rozšíření možnost je zobrazen pro roli opačné v každé relaci.Odstranit styl sloupec označuje, zda rozšíření na jeho výchozí nastavení je možnost, ale nemá žádný vliv samostatné.

Odstranit šíření hodnoty pomocí programového kódu

Možnosti v souboru definice DSL pouze umožňuje vybrat, zda odstranění šíří k okamžité sousedního.Chcete-li implementovat složitější schéma šíření delete, můžete napsat programového kódu.

[!POZNÁMKA]

Pro přidání programového kódu do DSL definition, vytvořte soubor samostatné kódu v Dsl projektů a zápis částečné definic posílit třídy ve složce vygenerovaném kódu.Další informace naleznete v tématu Zápis kódu pro úpravu jazyka specifického pro doménu.

Definování odstranění uzavření

Operace odstranění používá třídu YourModelDeleteClosure k určení prvky, které chcete odstranit, zadaný počáteční výběru.Volá ShouldVisitRelationship() a ShouldVisitRolePlayer() opakovaně, procházení grafu relací.Tyto metody lze přepsat.ShouldVisitRolePlayer je k dispozici s identitou odkaz a element v jednou z rolí na odkaz.Měl by být vrácen jeden z následujících hodnot:

  • VisitorFilterResult.Yes– Je třeba odstranit element a walkera má pokračovat na akci element uživatele odkazy.

  • VisitorFilterResult.DoNotCare– Element neměli odstraněn, avšak jiný dotaz odpovědi, že je nutné ji odstranit.

  • VisitorFilterResult.Never– I v případě, že odpoví na jiný dotaz nesmí být odstraněno element Yes, a neměl by se pokoušet walkera element uživatele 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);
    }
  }
}

Postup uzavření zajišťuje, že sadu elementů a odkazy, které má být odstraněn je určen před zahájením odstranění.Walkera také kombinuje výsledky své uzavření s pocházet z jiných částí modelu.

Technika však předpokládá, že odstranění ovlivní pouze jeho okolí v grafu relací: tuto metodu nelze použít k odstranění na prvek 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() ve třídě domény nebo ve vztahu domény.

  1. OnDeletingje volána, když je element má být odstraněn, ale před jeho vztahy být odpojeno.Je stále navigaci do a z dalších prvků a je stále v store.ElementDirectory.

    Je-li několik elementů budou odstraněny současně, OnDeleting je volána pro všechny z nich před provedením odstranění.

    IsDeletingHodnota true.

  2. OnDeletedje volána, když byl odstraněn elementu.Zůstane v haldy CLR tak, aby v případě potřeby můžete provést vrácení zpět, ale je odpojeny ze další prvky a odebrat z store.ElementDirectory.U relací rolí stále odkazovat na původní hráči role.IsDeleted má hodnotu true.

  3. OnDeleting a OnDeleted se nazývají, když uživatel volá zpět po vytvoření elementu a v případě dřívější odstranění se opakuje Redo.Použití this.Store.InUndoRedoOrRollback a vyhnout se tak aktualizace úložiště elementů v těchto případech.Další informace naleznete v tématu Postupy: Používání transakcí k aktualizaci modelu.

Například následující kód odstraní Album při odstranění jeho posledního podřízeného skladbu:

// 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();
} } } }

Často je další užitečná k aktivační události z odstranění relace než role element vzhledem k tomu, že toto funguje, obě při odstranění elementu a při odstranění samotná relace.Pro referenčního vztahu, můžete však šířit odstranění související prvek odstraněn, ale není v případě, že byl odstraněn samotná relace.Tento příklad odstraní Album, pokud je jeho poslední přispívající umělecké odstraněn, ale neodpovídá-li relace budou 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 provedení Delete na elementu, bude volána OnDeleting a OnDeleted.Tyto metody jsou vždy provádí vložený – to znamená, bezprostředně před a po skutečný odstranění.Pokud váš kód odstraní dvě nebo více prvků, OnDeleting a OnDeleted bude volána v alternativní na všech těchto zase.

Odstranění pravidla a události

Jako alternativu k OnDelete obslužných rutin můžete definovat pravidla odstranění a odstranění události.

  1. Deletinga Delete pravidla se spouštějí pouze v transakci a nikoli v zpět nebo znovu.Můžete nastavit, aby se ke spuštění na konci transakce, ve kterém je prováděno odstranění zařazené do fronty.Odstranění pravidla jsou vždy spuštěny před žádná pravidla odstraněno, které jsou ve frontě.

    Pomocí pravidel můžete rozšířit změny, které ovlivňují pouze elementy v úložišti, včetně relací, elementy diagramu a jejich vlastnosti.Obvykle odstranění pravidlo se používá k odstranění šířit a odstranění pravidlo se používá k vytvoření nahrazení prvky a vztahy.

    Další informace naleznete v tématu Pravidla šířící změny v modelu.

  2. Deletedúložiště události je vyvolána na konci transakce a je volána po provedení operace vrácení zpět nebo znovu.Lze proto šířit odstranění na objekty mimo úložiště, jako jsou soubory, položky databáze nebo ostatní objekty v Visual Studio.

    Další informace naleznete v tématu Obslužné rutiny události šíří změny mimo model.

    Poznámka k upozorněníUpozornění

    Pokud element byl odstraněn, lze získat přístup k jeho hodnoty vlastností domény, ale nelze přejít vztah odkazy.Pokud nastavíte Odstraněná událost v relaci, dostanete také dva elementy, které byly jeho role hráče.Pokud byste chtěli reagovat na odstranění prvku modelu, ale chcete získat přístup k elementu, na kterou bylo propojeno, proto nastavte událost delete v relaci namísto třídy prvek 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 odstranit událost

  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, která připojí k nadřazenému podřízený element se nazývá sloučení.K ní dojde, když nového elementu nebo skupinu elementů je vytvořen z panelu nástrojů nebo přesouvat z jiné části modelu nebo zkopírovaných ze schránky.Stejně jako vytváření vztahu vnoření mezi nadřazeného objektu a jeho podřízených nové, operace sloučení také nastavit další vztahy, vytvářet pomocné prvky a nastavit hodnoty vlastností v elementy.Operace sloučení zapouzdřena v elementu sloučení směrnice (EMD).

EMD zapouzdří také doplňkové oddělit nebo MergeDisconnect operace.Pokud máte clusteru elementů, který má byl zkonstruován pomocí sloučení, doporučujeme použít přiřazenou oddělit odebrat element z něj, pokud chcete nechat zbývající elementy v konzistentního stavu.Operace oddělit bude obvykle pomocí technik popsaných v předchozích částech.

Další informace naleznete v tématu Přizpůsobení vytvoření a přesunutí elementu.

Viz také

Koncepty

Přizpůsobení chování kopírování

Přizpůsobení vytvoření a přesunutí elementu

Další zdroje

Zápis kódu pro úpravu jazyka specifického pro doménu