Udostępnij za pośrednictwem


Dostosowywanie zachowania dotyczącego usuwania

Usuwanie elementu zwykle powoduje powiązane elementy, które mają zostać usunięte również.Wszystkie relacje dołączone do niego, a wszystkie elementy podrzędne zostaną usunięte.To zachowanie jest o nazwie usunąć propagacji.Można dostosować propagacji delete, na przykład ułożyć, że nowe elementy pokrewne zostaną usunięte.Pisząc kod programu, można dokonać propagacji delete są zależne od stanu modelu.Może powodować również inne zmiany w odpowiedzi na usunięcie.

Ten temat zawiera następujące sekcje:

  • Domyślnym zachowaniem usunięcia

  • Ustawienie opcji propagację usunięcie roli

  • Zastępowanie zamknięcia usunąć — użyć tej metody, gdzie usunięcia może doprowadzić do usunięcia z sąsiednimi elementów.

  • Przy użyciu OnDeleting i OnDeleted — użycie tych metod, gdzie odpowiedź może zawierać innych działań, takich jak aktualizowanie wartość lub spoza magazynu.

  • Usuwanie reguł — Użyj reguł propagację aktualizacje jakiegokolwiek rodzaju znajdujące się w magazynie, gdzie zmiany co może prowadzić do innych osób.

  • Usuwanie zdarzenia — zdarzenia magazynu użycia propagację aktualizacje poza magazynu, na przykład do innych Visual Studio dokumentów.

  • Rozdziel — przy użyciu operacji Rozdziel cofnąć operacji scalania, który dołączyć elementu podrzędnego nadrzędnym.

Domyślnym zachowaniem usunięcia

Domyślnie następujące zasady zarządzające propagacji delete:

  • Jeśli element zostanie usunięty, wszystkie osadzone elementy są także usuwane.Osadzone elementy są przeznaczone do celów osadzenia relacje, dla których ten element jest źródło.Na przykład w przypadku osadzenia relacji z albumu z utworu, następnie usunięcie określonego albumu jego utwory zostaną również usunięte.

    Z kolei usunięcie utworu nie powoduje usunięcia albumu.

  • Domyślnie usuwanie nie propaguje wzdłuż relacji odwołania.W przypadku relacji ArtistPlaysOnAlbum z albumu do wykonawcy, usunięcie albumu nie powoduje usunięcia żadnych powiązanych wykonawcy, a następnie usunięcie wykonawcy nie powoduje usunięcia żadnych albumu.

    Jednak usunięcia propagację wzdłuż niektóre wbudowane relacji.Na przykład po usunięciu elementu modelu jego kształt na diagramie są także usuwane.Element i kształtu są powiązane przez PresentationViewsSubject relacji odwołania.

  • Każdy relacji podłączonym do elementu, albo na roli źródłowa lub docelowa jest usuwana.Właściwości roli elementu w roli przeciwnego nie zawiera już element usunięty.

Ustawienie opcji propagację usunięcie roli

Może spowodować usunięcie propagację wzdłuż relacji odwołania lub osadzonych podrzędny nadrzędnym.

Aby ustawić propagacji delete

  1. Diagram definicji DSL, wybierz polecenie roli do której należy propagacji do usunięcia.Rola jest reprezentowany przez wiersz po lewej stronie lub po prawej stronie pola relacji domeny.

    Na przykład jeśli chcesz określić, że przy dodawaniu każdego albumu, został usunięty, wykonawców powiązanych są także usuwane, a następnie wybierz rolę połączone z klasy domeny wykonawcy.

  2. W oknie dialogowym właściwości ustaw propaguje usunąć właściwości.

  3. Naciśnij klawisz F5 i sprawdź, czy:

    • Wystąpienie tej relacji został usunięty, element w wybranej roli również zostaną usunięte.

    • Po usunięciu elementu w roli przeciwnego wystąpień tej relacji zostanie usunięta, a powiązane elementy w tej roli zostaną usunięte.

Można również wyświetlić propaguje usunąć opcji w szczegóły DSL okna.Wybierz klasę domeny, a następnie w okienku szczegółów DSL Otwórz Usuń zachowanie strony, kliknij przycisk na krawędzi okna.Propaguj opcji jest wyświetlany dla roli przeciwnego każdego relacji.Usuń styl kolumna wskazuje, czy Propaguj opcja jest w jego domyślne ustawienie, ale nie ma wpływu oddzielne.

Usuń propagacji przy użyciu kodu programu

Opcje w pliku definicji DSL umożliwiają jedynie wybrać, czy usunięcie propaguje do natychmiastowej sąsiada.Do zaimplementowania bardziej złożonych plan propagacji delete, można pisać kod programu.

[!UWAGA]

Aby dodać kod programu definicję DSL, Utwórz plik oddzielne kodu w Dsl projektu i Zapisz definicje częściowe chcą zwiększyć klasy w folderze wygenerowany kod.Aby uzyskać więcej informacji, zobacz Pisanie kodu pod kątem dostosowywania języka specyficznego dla domeny.

Definiowanie zamknięcie usuwania

Klasa korzysta z operacji usuwania YourModelDeleteClosure do określenia, które elementy do usunięcia, biorąc pod uwagę wartości początkowe.Wywołuje ShouldVisitRelationship() i ShouldVisitRolePlayer() regularnie, chodzenie wykresu relacji.Można zastąpić tych metod.ShouldVisitRolePlayer jest dostarczany z tożsamości łącze i element pod jedną z ról kliknięcie łącza.Powinien on zwrócić jedną z następujących wartości:

  • VisitorFilterResult.Yes— Usunięcia element i walkera, należy przejść do spróbuj elementu przez inne łącza.

  • VisitorFilterResult.DoNotCare— Element nie można usunąć, chyba że inną kwerendę odpowiedzi, aby go usunąć.

  • VisitorFilterResult.NeverMusi nie można usunąć elementu, nawet jeśli odpowiedzi na kwerendę Yes, i nie ma podjąć walkera elementu przez inne łącza.

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

Metoda zamknięcia zapewnia ustalona zestaw elementów oraz łącza do usunięcia przed rozpoczęciem usuwania.Walkera łączy również wyniki swojej zamknięcia z identyfikatorami z innymi elementami modelu.

Jednak techniki przyjęto, że usunięcie dotyczy tylko wokół w grafie relacji: nie można użyć tej metody można usunąć element w innej części modelu.Nie można używać go, aby dodać elementy lub inne zmiany w odpowiedzi na usunięcie.

Przy użyciu OnDeleting i OnDeleted

Można zastąpić OnDeleting() lub OnDeleted() w klasie domeny lub w relacji domeny.

  1. OnDeletingjest wywoływana, gdy element ma zostać usunięty, ale przed jej relacje Rozłączono.Jest nadal można nawigować do i z innymi elementami i jest nadal w store.ElementDirectory.

    Usunięcie kilku elementów w tym samym czasie OnDeleting jest wywoływana przed wykonaniem operacji usuwania dla wszystkich użytkowników.

    IsDeletingma wartość true.

  2. OnDeletedjest wywoływane, gdy element został usunięty.Pozostaje w stosie CLR, aby w razie potrzeby można wykonać cofania, ale jest niepołączone z innymi elementami i usunąć z store.ElementDirectory.W przypadku relacji role odwołuje się nadal stary gracze roli.IsDeleted ma wartość true.

  3. OnDeleting i OnDeleted są wywoływane, gdy użytkownik wywołuje cofania po utworzeniu elementu i usuwanie starszych zostanie skopiowany do ponownego wykonania.Użyj this.Store.InUndoRedoOrRollback w celu uniknięcia aktualizowanie elementów magazynu w takich sytuacjach.Aby uzyskać więcej informacji, zobacz Porady: użycie transakcji do aktualizacji modelu.

Na przykład następujący kod usuwa albumu po jego ostatniego elementu podrzędnego utwór został usunięty:

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

Często jest więcej przydatne do wyzwalacza przed usunięciem relacji niż element roli, ponieważ to działa zarówno po usunięciu elementu, a po usunięciu samą relację.W przypadku relacji odwołania może być propagację usunięcia po usunięciu elementu powiązane, ale nie w przypadku, gdy samą relację, został usunięty.W tym przykładzie usuwa albumu podczas jego ostatnich wykonawcy udział został usunięty, ale nie odpowiada, jeśli relacje zostaną usunięte:

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

Po uruchomieniu Delete na elemencie, OnDeleting i OnDeleted zostanie wywołana.Te metody są zawsze realizowany tekście — oznacza to, że bezpośrednio przed i po usunięciu rzeczywistych.Jeśli Twój kod usuwa co najmniej dwa elementy, OnDeleting i OnDeleted zostanie wywołana w alternatywy na wszystkie elementy z kolei.

Usuwanie reguł i zdarzeń

Jako alternatywę dla programów obsługi OnDelete można zdefiniować reguły usuwania i usuwanie zdarzeń.

  1. Deletingi Delete zasady są wywoływane tylko w ramach transakcji, a nie w cofania lub wykonywania ponownego.Można ustawić je znajdować się w kolejce do wykonania na końcu transakcji, w którym jest wykonywane usuwania.Usuwanie reguł są zawsze wykonywane przed wszystkich reguł Deleted, które znajdują się w kolejce.

    Użyj reguł propaguje zmiany, które dotyczą tylko elementów w magazynie, w tym relacje, elementów diagramu i ich właściwości.Zazwyczaj reguły usuwanie służy do usuwania propagację i reguła usuwania jest używany do tworzenia elementów zastąpienie i relacje.

    Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.

  2. Deletedzdarzenia magazynu jest wywoływane na końcu transakcji i jest wywoływana po wykonaniu cofania lub ponownego wykonania.Dlatego można propagację operacje usuwania na obiekty spoza magazynu, takie jak pliki, wpisy bazy danych lub innych obiektów w Visual Studio.

    Aby uzyskać więcej informacji, zobacz Programy obsługi zdarzeń propagujące zmiany poza modelem.

    Informacje dotyczące przestrogiPrzestroga

    Po usunięciu elementu, można uzyskać dostęp do jego wartości właściwości domeny, ale nie może przejść łącza relacji.Jednakże jeśli usunięto zdarzenie jest ustawiona na relacji, można także przejść dwa elementy, które zostały gracze jego rolę.W związku z tym jeśli chcesz odpowiedzieć usuwanie elementu modelu, ale chcesz uzyskać dostęp do elementu, z którym została powiązana ustawiać zdarzenia delete relacji zamiast klasy domeny elementu modelu.

Przykład usuwanie reguł

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

Przykład usunięto zdarzenie

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

Rozdziel

Operacja dołączony do nadrzędnego elementu podrzędnego jest nazywana scalania.Występuje, gdy nowy element lub grupę elementów jest tworzone z przybornika, przenosić z innej części modelu lub kopiowanych ze Schowka.Oraz tworzeniu osadzenia relacji między nadrzędnym a jego nowy element podrzędny operacji scalania można również skonfigurować dodatkowe relacje, tworzyć elementy pomocnicze i ustawiania wartości właściwości w elementach.W operacji scalania jest hermetyzowany w elemencie scalania dyrektywy (EMD).

EMD również hermetyzuje uzupełniające Rozdziel lub MergeDisconnect operacji.Jeśli masz klastra elementów, która została skonstruowana przy użyciu scalania, zaleca się używać skojarzonego Rozdziel do usuwania elementu, aby pozostawić wszystkie pozostałe elementy spójna.Operacja Rozdziel będą używane są zwykle techniki opisane w poprzednich sekcjach.

Aby uzyskać więcej informacji, zobacz Dostosowywanie tworzenia i przesuwania elementów.

Zobacz też

Koncepcje

Dostosowywanie zachowania dotyczącego kopiowania

Dostosowywanie tworzenia i przesuwania elementów

Inne zasoby

Pisanie kodu pod kątem dostosowywania języka specyficznego dla domeny