다음을 통해 공유


삭제 동작 사용자 지정

일반적으로 요소를 삭제 하면 삭제 관련된 요소가 됩니다.모든 관계에 연결 되 고 모든 자식 요소가 삭제 됩니다.이 동작은 명명 됩니다 삭제 전파.추가 관련된 요소 삭제 되도록 정렬 하는 데 예를 들어 delete 전파를 사용자 지정할 수 있습니다.프로그램 코드를 작성 하 여 전파를 삭제할 수 있습니다 모델의 상태에 따라 달라 집니다.삭제에 대 한 응답으로 발생 하는 다른 변경 사항이 발생할 수도 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 기본 삭제 동작

  • 이 역할의 전파 삭제 옵션 설정

  • 재정의 삭제 폐쇄 – 인접 요소를 삭제 하려면 삭제 이어질 수 있는 곳이 기법을 사용 합니다.

  • OnDeleting Ondeleted를 사용 하 여 – 위치 응답 내부 또는 외부 저장소를 사용 하는 값을 업데이트 하는 것과 같은 다른 작업이 포함 될 수 있습니다 이러한 메서드를 사용 합니다.

  • 삭제 규칙 – 규칙을 사용 하 여 위치 변경 될 수 있습니다 발생할 다른 사람에 게는 저장소 내에서 어떤 종류의 업데이트를 전파할 수 있습니다.

  • 삭제 이벤트 – 외부에 다른 예를 들어 저장소에 업데이트를 전파 하는 데 사용할 저장소 이벤트 Visual Studio 문서입니다.

  • 분할 -분할 작업을 사용 하 여 자식 요소를 해당 부모에 연결 하는 병합 작업을 실행 취소 합니다.

기본 삭제 동작

기본적으로, 다음 규칙 삭제 전파를 관리합니다.

  • 요소를 삭제 하면 포함 된 모든 요소가 삭제 됩니다.포함 된 요소를이 요소는 원본 있는 관계를 포함 하는 대상이 되는입니다.노래 앨범을 포함 관계가 있으면 특정 앨범 삭제 하면 예를 들어, 다음의 모든 곡은 삭제 됩니다.

    이와 대조적으로, 노래 앨범 삭제 해도.

  • 기본적으로 삭제 참조 관계를 따라 전파 되지 않습니다.ArtistPlaysOnAlbum 앨범에서 음악가에 대 한 참조 관계가 있을 경우 모든 관련 된 음악가 앨범 삭제는 삭제 되지 않습니다 및 음악가가 삭제 된 앨범 삭제 되지 않습니다.

    그러나 삭제 일부 기본 제공 관계를 따라 전파 되지.예를 들어, 모델 요소가 삭제 되 면 해당 셰이프를 다이어그램에서 삭제 됩니다.으로 관련 된 요소 및 셰이프는 PresentationViewsSubject 관계를 참조 합니다.

  • 원본 또는 대상 역할에서 요소에 연결 된 모든 관계가 삭제 됩니다.역할 속성에는 반대 역할에 있는 요소의 더 이상 삭제 된 요소를 포함합니다.

이 역할의 전파 삭제 옵션 설정

참조 관계에 따라 나는 부모에 포함 된 하위 전파 합니다 삭제가 될 수 있습니다.

Delete 전파를 설정 하려면

  1. DSL 정의 다이어그램에서 선택은 역할 를 삭제 하는 전파 합니다.역할을 왼쪽 이나 오른쪽 도메인 관계 상자에 선으로 표시 됩니다.

    예를 들어, 앨범 삭제할 때마다 지정 하려면 관련된 음악가 삭제 되 고 음악가 도메인 클래스에 연결 하는 역할을 선택 합니다.

  2. 속성 창에서 설정에서 전파 삭제 속성입니다.

  3. F5 키를 눌러 및 확인 하십시오.

    • 이 관계의 인스턴스를 삭제 하면 선택된 된 역할에 있는 요소를 또한 삭제 됩니다.

    • 반대 역할에 있는 요소를 삭제할 때이 관계의 인스턴스를 삭제 합니다 및이 역할에는 관련 된 요소를 삭제 합니다.

또한 볼 수 있습니다는 전파를 삭제 옵션에 DSL 정보 창.도메인 클래스를 선택 하 고 DSL 세부 정보 창에서 열을 삭제 동작 왼쪽 창에 있는 단추를 클릭 하 여 페이지입니다.해당 전파 된 각 관계의 반대 역할에 대 한 옵션입니다.스타일 삭제 열 표시 여부를 전파 옵션을 기본 설정으로 되어 있지만 별도 효과 없는.

프로그램 코드를 사용 하 여 전파를 삭제

DSL 정의 파일 에서만 삭제는 즉시 네트워크 환경에 전파 됩니다 여부를 선택할 수 있습니다.Delete 전파의 좀 더 복잡 한 스키마를 구현 하려면 프로그램 코드를 작성할 수 있습니다.

[!참고]

프로그램 코드를 DSL 정의에 추가 하려면 별도 코드 파일에 생성은 Dsl 프로젝트 및 클래스 폴더에 있는 생성 된 코드를 추가 하는 부분 정의 작성 합니다.자세한 내용은 도메인별 언어를 사용자 지정하는 코드 작성를 참조하십시오.

Delete 클로저를 정의합니다.

클래스 삭제 작업을 사용 하 여 YourModelDeleteClosure 삭제는 초기 선택 지정 된 요소를 확인 합니다.호출 ShouldVisitRelationship() 및 ShouldVisitRolePlayer() 반복적으로 그래프의 관계를 탐색 합니다.이 메서드를 재정의할 수 있습니다.ShouldVisitRolePlayer id에 대 한 링크 및 링크의 역할 중 하나에 있는 요소를 제공 합니다.다음 값 중 하나를 반환 해야 합니다.

  • 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() 또는 OnDeleted() 도메인 클래스 또는 도메인 관계입니다.

  1. OnDeleting요소에 대 한 삭제 됩니다 있지만 연결이 끊어진 관계 하기 전에 호출 됩니다.다른 요소에서 아직 탐색할 수 이며 여전히입니다 store.ElementDirectory.

    동시에 여러 요소가 삭제 되 면 OnDeleting 모든에 대 한 삭제를 수행 하기 전에 호출 됩니다.

    IsDeleting도 마찬가지입니다.

  2. OnDeleted요소가 삭제 될 때 호출 됩니다.필요한 경우 실행 취소를 수행할 수 있지만 다른 요소에서 해제 되 고 제거 CLR 힙에서 유지 됩니다 store.ElementDirectory.관계에 대 한 역할이 이전 역할 수행자 계속 참조합니다.IsDeleted is 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. DeletingDelete 규칙이 트리거되는 트랜잭션 하는 실행 취소 또는 다시 실행에만 합니다.삭제가 수행 된 트랜잭션의 끝에서 실행 큐에 설정할 수 있습니다.규칙을 삭제 하기 전에 큐에 있는 모든 삭제 된 규칙이 항상 실행 됩니다.

    요소 관계, 다이어그램 요소 및 속성을 포함 하 여 저장소에만 영향을 주는 변경 내용을 전파 하는 데 규칙을 사용 합니다.일반적으로 삭제 규칙 삭제를 전파 하는 데 사용 됩니다 및 삭제 규칙이 대체 요소 및 관계를 만드는 데 사용 됩니다.

    자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.

  2. Deleted저장소 이벤트는 트랜잭션이 끝날 때 호출 되 고 실행 취소 또는 다시 실행 한 후에 호출 됩니다.삭제 파일, 데이터베이스 또는 다른 개체에 같은 저장소 외부 개체에 전파할 수 없으므로 사용할 수 있습니다 Visual Studio.

    자세한 내용은 이벤트 처리기로 모델 외부의 변경 내용 전파를 참조하십시오.

    주의 정보주의

    요소를 삭제할 때 해당 도메인 속성 값에 액세스할 수 있지만 링크 관계를 탐색할 수 없습니다.그러나 관계에서 삭제 된 이벤트를 설정 하면 해당 역할 수행자 이었던 두 요소를 액세스할 수도 있습니다.따라서 응답 모델 요소를 삭제할 수 있지만 연결 된 요소에 액세스 하려면 delete 이벤트 모델 요소 도메인 클래스의 관계를 설정 합니다.

Bb126560.collapse_all(ko-kr,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(ko-kr,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는도 보완적인 캡슐화 분할 또는 MergeDisconnect 작업입니다.병합을 사용 하 여 구성 된 클러스터의 요소에 있는 경우 연결 된 사용 하도록 권장 됩니다 나머지 요소는 일관 된 상태로 유지 하는 경우 요소에서 제거할 병합을 해제 합니다.분할 작업을 일반적으로 이전 섹션에서 설명한 기술을 사용 합니다.

자세한 내용은 요소 만들기 및 이동 사용자 지정를 참조하십시오.

참고 항목

개념

복사 동작 사용자 지정

요소 만들기 및 이동 사용자 지정

기타 리소스

도메인별 언어를 사용자 지정하는 코드 작성