삭제 동작 사용자 지정
일반적으로 요소를 삭제 하면 삭제 관련된 요소가 됩니다.모든 관계에 연결 되 고 모든 자식 요소가 삭제 됩니다.이 동작은 명명 됩니다 삭제 전파.추가 관련된 요소 삭제 되도록 정렬 하는 데 예를 들어 delete 전파를 사용자 지정할 수 있습니다.프로그램 코드를 작성 하 여 전파를 삭제할 수 있습니다 모델의 상태에 따라 달라 집니다.삭제에 대 한 응답으로 발생 하는 다른 변경 사항이 발생할 수도 있습니다.
이 항목에는 다음 단원이 포함되어 있습니다.
기본 삭제 동작
이 역할의 전파 삭제 옵션 설정
재정의 삭제 폐쇄 – 인접 요소를 삭제 하려면 삭제 이어질 수 있는 곳이 기법을 사용 합니다.
OnDeleting Ondeleted를 사용 하 여 – 위치 응답 내부 또는 외부 저장소를 사용 하는 값을 업데이트 하는 것과 같은 다른 작업이 포함 될 수 있습니다 이러한 메서드를 사용 합니다.
삭제 규칙 – 규칙을 사용 하 여 위치 변경 될 수 있습니다 발생할 다른 사람에 게는 저장소 내에서 어떤 종류의 업데이트를 전파할 수 있습니다.
삭제 이벤트 – 외부에 다른 예를 들어 저장소에 업데이트를 전파 하는 데 사용할 저장소 이벤트 Visual Studio 문서입니다.
분할 -분할 작업을 사용 하 여 자식 요소를 해당 부모에 연결 하는 병합 작업을 실행 취소 합니다.
기본 삭제 동작
기본적으로, 다음 규칙 삭제 전파를 관리합니다.
요소를 삭제 하면 포함 된 모든 요소가 삭제 됩니다.포함 된 요소를이 요소는 원본 있는 관계를 포함 하는 대상이 되는입니다.노래 앨범을 포함 관계가 있으면 특정 앨범 삭제 하면 예를 들어, 다음의 모든 곡은 삭제 됩니다.
이와 대조적으로, 노래 앨범 삭제 해도.
기본적으로 삭제 참조 관계를 따라 전파 되지 않습니다.ArtistPlaysOnAlbum 앨범에서 음악가에 대 한 참조 관계가 있을 경우 모든 관련 된 음악가 앨범 삭제는 삭제 되지 않습니다 및 음악가가 삭제 된 앨범 삭제 되지 않습니다.
그러나 삭제 일부 기본 제공 관계를 따라 전파 되지.예를 들어, 모델 요소가 삭제 되 면 해당 셰이프를 다이어그램에서 삭제 됩니다.으로 관련 된 요소 및 셰이프는 PresentationViewsSubject 관계를 참조 합니다.
원본 또는 대상 역할에서 요소에 연결 된 모든 관계가 삭제 됩니다.역할 속성에는 반대 역할에 있는 요소의 더 이상 삭제 된 요소를 포함합니다.
이 역할의 전파 삭제 옵션 설정
참조 관계에 따라 나는 부모에 포함 된 하위 전파 합니다 삭제가 될 수 있습니다.
Delete 전파를 설정 하려면
DSL 정의 다이어그램에서 선택은 역할 를 삭제 하는 전파 합니다.역할을 왼쪽 이나 오른쪽 도메인 관계 상자에 선으로 표시 됩니다.
예를 들어, 앨범 삭제할 때마다 지정 하려면 관련된 음악가 삭제 되 고 음악가 도메인 클래스에 연결 하는 역할을 선택 합니다.
속성 창에서 설정에서 전파 삭제 속성입니다.
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() 도메인 클래스 또는 도메인 관계입니다.
OnDeleting요소에 대 한 삭제 됩니다 있지만 연결이 끊어진 관계 하기 전에 호출 됩니다.다른 요소에서 아직 탐색할 수 이며 여전히입니다 store.ElementDirectory.
동시에 여러 요소가 삭제 되 면 OnDeleting 모든에 대 한 삭제를 수행 하기 전에 호출 됩니다.
IsDeleting도 마찬가지입니다.
OnDeleted요소가 삭제 될 때 호출 됩니다.필요한 경우 실행 취소를 수행할 수 있지만 다른 요소에서 해제 되 고 제거 CLR 힙에서 유지 됩니다 store.ElementDirectory.관계에 대 한 역할이 이전 역할 수행자 계속 참조합니다.IsDeleted is true.
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 처리기 대신 삭제 규칙 및 삭제 이벤트를 정의할 수 있습니다.
Deleting및 Delete 규칙이 트리거되는 트랜잭션 하는 실행 취소 또는 다시 실행에만 합니다.삭제가 수행 된 트랜잭션의 끝에서 실행 큐에 설정할 수 있습니다.규칙을 삭제 하기 전에 큐에 있는 모든 삭제 된 규칙이 항상 실행 됩니다.
요소 관계, 다이어그램 요소 및 속성을 포함 하 여 저장소에만 영향을 주는 변경 내용을 전파 하는 데 규칙을 사용 합니다.일반적으로 삭제 규칙 삭제를 전파 하는 데 사용 됩니다 및 삭제 규칙이 대체 요소 및 관계를 만드는 데 사용 됩니다.
자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.
Deleted저장소 이벤트는 트랜잭션이 끝날 때 호출 되 고 실행 취소 또는 다시 실행 한 후에 호출 됩니다.삭제 파일, 데이터베이스 또는 다른 개체에 같은 저장소 외부 개체에 전파할 수 없으므로 사용할 수 있습니다 Visual Studio.
자세한 내용은 이벤트 처리기로 모델 외부의 변경 내용 전파를 참조하십시오.
주의 요소를 삭제할 때 해당 도메인 속성 값에 액세스할 수 있지만 링크 관계를 탐색할 수 없습니다.그러나 관계에서 삭제 된 이벤트를 설정 하면 해당 역할 수행자 이었던 두 요소를 액세스할 수도 있습니다.따라서 응답 모델 요소를 삭제할 수 있지만 연결 된 요소에 액세스 하려면 delete 이벤트 모델 요소 도메인 클래스의 관계를 설정 합니다.
삭제 규칙 예제
[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();
}
}
이벤트 삭제 예제
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 작업입니다.병합을 사용 하 여 구성 된 클러스터의 요소에 있는 경우 연결 된 사용 하도록 권장 됩니다 나머지 요소는 일관 된 상태로 유지 하는 경우 요소에서 제거할 병합을 해제 합니다.분할 작업을 일반적으로 이전 섹션에서 설명한 기술을 사용 합니다.
자세한 내용은 요소 만들기 및 이동 사용자 지정를 참조하십시오.