Поделиться через


Настройка функции удаления

Удаление элемента обычно приводит к связанные элементы быть удалены.Все связи подключения к серверу и все дочерние элементы удаляются.Эта реакция на событие, называется распространение delete.Можно настраивать распространение delete, например для размещения дополнительные связанные элементы удаляются.Написать программный код, можно сделать зависит от распространения удаления состояние из модели.Можно также вызвать другие изменения выполняться в ответ на удаление.

В этом разделе содержатся следующие подразделы.

  • Реакция на событие удаления по умолчанию

  • Настройка распространения удалите параметр роли

  • Переопределение закрытие delete - Используйте этот метод, если удаление может привести к drop соседских элементов.

  • Использование OnDeleting и OnDeleted - Используйте эти методы, в которых ответ может содержать другие действия, как обновить значение или внутри или вне хранилища.

  • Правила удаления - Используйте правила распространения обновлений любого типа в хранилище, где одно изменение может привести к другой.

  • События перетаскивания - Используйте события хранилища для распространения обновлений вне хранилища, например в другой Visual Studio документы.

  • Разъединить - используйте операцию UnMerge для отмены операции слияния, вложила дочерний элемент с родительским элементом.

Реакция на событие удаления по умолчанию

По умолчанию следующие правила управлять распространением delete:

  • , Если элемент удален, то все внедренные элементы также удаляются.Внедренные элементы те, которые целевые объекты внедрение связей, для которых данный элемент источника.Например, если связь альбома для внедрения песне, когда указанный альбом будут удалены все его песни также будут удалены.

    Напротив, при удалении песня не удаляет альбом.

  • По умолчанию удаление не распространяется вдоль связей ссылок.Если связь ArtistPlaysOnAlbum ссылки из альбома к исполнителю, то при удалении альбом не удаляет ни связанный исполнитель и удаление исполнитель не удаляет ни альбом.

    Однако удаление распространяется вдоль некоторых встроенных связей.Например, если элемент модели удален, его фигуры на схеме также удаляется.Элемент и связанные фигуры PresentationViewsSubject отношение ссылки.

  • Каждое отношение, которое подключено к элементу или в роли источника или целевого объекта, удаляются.Роль свойства элемента на противоположной роли больше не содержит удаленный элемент.

Настройка распространения удалите параметр роли

Можно вызвать удаление распространения по связи ссылки или из внедренного дочернего элемента с родительским элементом.

Задать распространение delete

  1. На схеме определения выберите DSL роль к которому требуется распространение удаления.Роль представлена линией на левой или правой части окна ссылки доменной.

    Например, если необходимо указать, что, когда альбом удаляется, удаляются также связанные исполнители, а затем выбрать роль подключенная к исполнителю доменного класса.

  2. В окне свойства установите Распространяет удалить свойство.

  3. Нажмите клавишу F5 и убедитесь, что:

    • Когда экземпляр данного отношения удаляется элемент в выбранной роли также будет удален.

    • Если элемент на противоположной роли будет удален, экземпляры данного отношения будут удалены, а также будут удалены связанные элементы в этой роли.

Можно также увидеть Распространяет удалить параметр Сведения DSL окна.Выберите доменный класс и в окне подробности DSL, открытие Реакция на событие delete страница, нажав кнопку сбоку окна. Propagate параметр отображается на противоположной роли каждого отношения.удаление стиля указывает, является ли столбец Propagate параметр на своем параметре по умолчанию, но он не имеет каких-либо отдельных действий.

Распространение удаления с помощью программного кода

Параметры в файле определения DSL только позволяют выбрать распространяет ли удаление к соседу интерпретация.Для реализации более сложная схема распространения delete, можно написать программный код.

ПримечаниеПримечание

Чтобы добавить программный код в определение DSL, создайте отдельный файл кода Dsl определения проекта и записи частично увеличить классы в созданной папке кода.Дополнительные сведения см. в разделе Написание кода для настройки доменного языка.

Указание закрытие delete

Операция удаления использует класс YourModelDeleteClosure определить, какие элементы для удаления, если начальное выделение.Она вызывает ShouldVisitRelationship() и ShouldVisitRolePlayer() повторно, гуляющ диаграмма связей.Можно переопределить эти методы.ShouldVisitRolePlayer предоставляется с идентификатором соединения и элементов на одной из ролей ссылки.Он должен возвращать одно из следующих значений:

  • VisitorFilterResult.Yes- Элемент должен быть удален и ходок следует продолжить использовать другие ссылки элемента.

  • VisitorFilterResult.DoNotCare - Элемент не должен быть удален, если другие вопросы запроса, что он должен быть удален.

  • VisitorFilterResult.Never - Элемент следует удалять, даже если это другой запрос отвечает Yesи ходок не должен попробовать другие ссылки элемента.

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

Метод закрытия гарантирует, что набор элементов и ссылок для удаления определить, прежде чем начинается удаление.Ходок также объединяет результаты закрытия с этими из других частей модели.

Однако метод предполагает удаления затрагивает только его соседей в диаграмме связей: этот метод нельзя использовать для удаления элемента в другой части модели.Его нельзя использовать, если нужно добавить элементы или выполнять другие изменения в ответ на удаление.

Использование OnDeleting и OnDeleted

Можно переопределить OnDeleting() OR OnDeleted() или в доменном классе или в доменной ссылки.

  1. OnDeleting вызывается, когда элемент будет удален, но до его связей отключен.Он еще водоходн к службе и от других элементов и по-прежнему in store.ElementDirectory.

    Если удаляется несколько элементов одновременно, OnDeleting вызывается для всех этих до выполнения операций удаления.

    IsDeleting - true.

  2. OnDeleted вызывается, когда элемент был удален.Он остается в куче среды CLR, так что при необходимости можно выполнить откат, но unlinked от других элементов в коллекции и удален из store.ElementDirectory.Для связей, роли, по-прежнему ссылаются на старую роль проигрывателей.IsDeleted - true.

  3. OnDeleting и OnDeleted вызываются, когда пользователь вызывает откат после создания элемента и при более ранняя удаление повторенно в повторе.Используйте this.Store.InUndoRedoOrRollback избегайте обновление элементов в подобных случаях.Дополнительные сведения см. в разделе Практическое руководство. Обновление модели с помощью транзакций.

Например, следующий код удаляет альбом, если его последняя песня дочернего элемента удалена.

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

Часто более эффективным активировать удаления связи с чем роль элемента, так как это работает оба, когда элемент удаляется, когда удаляется и сама связь.Однако для связи ссылки, возможно, потребуется распространять удаления, если связанный элемент удален, но не при удалении сама связь.В этом примере удаляется альбом при ее последнего содержащий подставляемые исполнитель удален, но не отвечает при удалении связи.

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

При выполнении Delete на элементе, будут вызваны OnDeleting и OnDeleted.Эти методы всегда запускаются встроенный, т е непосредственно перед и после фактического удаления.Если код удаляет две или несколько элементов, OnDeleting и OnDeleted будут вызваны в перемежении на всех этих в свою очередь.

Правила удаления и события

В качестве альтернативы к обработчикам OnDelete, можно указать правила удаления и события перетаскивания.

  1. Deleting и Delete правила активированы только в транзакции, а не в откате или повторе.Можно задавать их для очереди для выполнения в конце транзакции, в которой производится удаление.Удаление правила всегда выполнять перед всеми правилами, удаленных из очереди.

    Используйте правила распространения изменений, затрагивающих только элементы в хранилище, включая связи, элементы схемы и их свойствами.Обычно используется при удалении правила распространения удаление и используется правило удаления создание элементов и отношений замены.

    Дополнительные сведения см. в разделе Правила распространяют изменения в пределах модели.

  2. Deleted событие хранилища вызывается в конце транзакции и вызывается после отката или повтора.Поэтому его можно использовать, чтобы распространять удаления на объекты вне хранилища, таким как файлы, записи базы данных или другие объекты в пределах Visual Studio.

    Дополнительные сведения см. в разделе Обработчики событий распространяют изменения за пределы модели.

    Предупреждающее замечаниеВнимание

    Если элемент был удален, можно получить доступ к его значения свойства домена, однако не позволяет перемещаться по ссылке отношения.Однако если необходимо установить удаленное событие в отношении, можно также получить доступ 2 элемента, была своей ролью проигрывателей.Поэтому, если необходимо ответить на drop элемента модели только потребоваться получить доступ к элементу, к которому он был связан задайте событие удаления в отношении вместо доменного класса элемента модели.

Bb126560.collapse_all(ru-ru,VS.110).gifПример правила удаления

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

Bb126560.collapse_all(ru-ru,VS.110).gifУдаленное событие пример

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

Разъединить

Операция, вложение дочерний элемент в родительском элементе, называется Объединить.Это происходит, когда новые элемент или группа в составе элементы создаются из области элементов или перемещены из другой части модели или копируются из буфера обмена.Кроме того, процесс создания внедрения связь между родительским и его новым дочерним элементом, операция слияния может также настроить дополнительные связи, создать вспомогательные элементы и задать значения свойств в элементах.Операция слияния инкапсулируются в директиве слияния элементов (EMD).

EMD также инкапсулирует комплементарное unmerge OR MergeDisconnect операция.Если имеется кластер элементов, который был создан с помощью слияния, рекомендуется использовать, связанное unmerge, чтобы удалить элемент из него, если нужно оставить остальные элементы в согласованное состояние.Операция unmerge обычно будет использовать методы, описанные в предыдущих разделах.

Дополнительные сведения см. в разделе Настройка создания и перемещения элементов.

См. также

Основные понятия

Настройка функции копирования

Настройка создания и перемещения элементов

Другие ресурсы

Написание кода для настройки доменного языка