다음을 통해 공유


프로그램 코드에서 모델 탐색 및 업데이트

만들기 및 모델 요소를 삭제, 그 속성을 설정 하 고 만들고 요소 간의 연결을 삭제 하는 코드를 작성할 수 있습니다.모든 변경 내용은 트랜잭션 내에서 이루어져야 합니다.요소는 다이어그램에 표시 되는 경우 다이어그램 "자동 트랜잭션 끝에 해결 됩니다".

항목 내용

예제에서는 DSL 정의

모델 탐색

클래스 정보에 액세스

트랜잭션 내 변경 내용을 수행 합니다.

모델 요소 만들기

관계 링크 만들기

요소 삭제

관계 링크 삭제

관계의 링크 순서 변경

잠금

복사 및 붙여넣기

탐색 및 다이어그램 업데이트

셰이프 및 요소 간 이동

셰이프와 연결선의 속성

DocView 및 DocData

도형, 연결선 및 다이어그램 및 상호 관계 모델 요소에 별도 항목으로 설명 합니다.자세한 내용은 [리디렉션] 방법: 다이어그램 탐색 및 업데이트를 참조하십시오.

예제에서는 DSL 정의

이이 항목의 예제에 대 한 Dsldefinition.dsl의 주요 부분입니다.

DSL 정의 다이어그램 - 패밀리 트리 모델

이 모델이이 DSL의 인스턴스입니다.

Tudor 패밀리 트리 모델

Cc512845.collapse_all(ko-kr,VS.110).gif참조 및 네임 스페이스

이 항목의 코드를 실행 하려면를 참조 해야 합니다.

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

이 네임 스페이스를 코드를 사용 합니다.

using Microsoft.VisualStudio.Modeling;

또한, 다른 프로젝트를 DSL을 정의 하는 데 사용 된 1에서 코드를 작성 하는 경우 Dsl 프로젝트에 의해 빌드되는 어셈블리를 가져와야 합니다.

모델 탐색

Cc512845.collapse_all(ko-kr,VS.110).gif속성

DSL 정의를 정의 하는 도메인 등록 정보에서 프로그램 코드에 액세스할 수 있는 속성이 됩니다.

Person henry = ...;

if (henry.BirthDate < 1500) ...

if (henry.Name.EndsWith("VIII")) ...

속성을 설정 하려는 경우에 이렇게 합니다는 트랜잭션:

henry.Name = "Henry VIII";

DSL 정의에서 속성의 경우 종류 입니다 계산를 설정할 수 없습니다.자세한 내용은 계산된 저장소 속성 및 사용자 지정 저장소 속성를 참조하십시오.

Cc512845.collapse_all(ko-kr,VS.110).gif관계

DSL 정의를 정의 하는 도메인 관계 속성 클래스 관계의 양쪽 끝에 쌍은 수 있습니다.속성의 이름은 DslDefinition 다이어그램에 관계의 각 측에서 역할에 레이블로 표시 됩니다.역할의 복합성에 따라 해당 속성의 형식을 관계의 다른 쪽 끝에 클래스 또는 해당 클래스의 컬렉션입니다.

foreach (Person child in henry.Children) { ... }

FamilyTreeModel ftree = henry.FamilyTreeModel;

항상 속성은 관계의 반대편 끝에는 역.연결을 만들거나 삭제 하는 경우 두 요소에 대 한 역할 속성 업데이트 됩니다.다음 식 (확장명을 사용 하는 System.Linq) 항상 true ParentsHaveChildren 관계 예제에서입니다:

(Person p) => p.Children.All(child => child.Parents.Contains(p))

&& p.Parents.All(parent => parent.Children.Contains(p));

ElementLinks.관계 라는 모델 요소에도 표시 됩니다는 링크, 인스턴스를 도메인 관계 유형입니다.링크는 항상 원본 요소 및 대상 요소가 있습니다.소스 개체 및 대상 요소가 같을 수 있습니다.

링크 및 해당 속성에 액세스할 수 있습니다.

ParentsHaveChildren link = ParentsHaveChildren.GetLink(henry, edward);

// This is now true:

link == null || link.Parent == henry && link.Child == edward

기본적으로 관계의 인스턴스가 둘 이상 모델 요소 쌍을 연결할 수 있습니다.하지만 DSL 정의 하는 경우에 Allow Duplicates 플래그 관계에 대해 true입니다 한 다음 둘 이상 연결 될 수 있습니다 및 사용 하 여 GetLinks:

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinks(henry, edward)) { ... }

또한 링크를 통해 다른 방법입니다.예를 들면 다음과 같습니다.

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinksToChildren(henry)) { ... }

숨겨진된 역할입니다. DSL 정의 하는 경우에 속성이 생성 됩니다 입니다 false 특정 역할에 대 한 다음 속성이 해당 역할에 생성 됩니다.그러나 링크에 액세스 하 고 관계의 메서드를 사용 하 여 링크를 통과할 계속 합니다.

foreach (Person p in ParentsHaveChildren.GetChildren(henry)) { ... }

자주 사용 하는 예제입니다 있는 PresentationViewsSubject 모델 요소가 다이어그램에 표시 된 도형을 연결 하는 관계.

PresentationViewsSubject.GetPresentation(henry)[0] as PersonShape

Cc512845.collapse_all(ko-kr,VS.110).gif요소가 요소 디렉터리

모든 요소가 요소 디렉터리를 사용 하 여 저장소에 액세스할 수 있습니다.

store.ElementDirectory.AllElements

또한 다음과 같은 요소를 찾는 방법입니다.

store.ElementDirectory.FindElements(Person.DomainClassId);

store.ElementDirectory.GetElement(elementId);

클래스 정보에 액세스

클래스, 관계 및 DSL 정의의 다른 측면에 대 한 정보를 얻을 수 있습니다.예를 들면 다음과 같습니다.

DomainClassInfo personClass = henry.GetDomainClass();

DomainPropertyInfo birthProperty =

personClass.FindDomainProperty("BirthDate")

DomainRelationshipInfo relationship =

link.GetDomainRelationship();

DomainRoleInfo sourceRole = relationship.DomainRole[0];

상위 클래스의 모델 요소는 다음과 같습니다.

  • 모델 요소-모든 요소와 관계 된 모델 요소

  • ElementLink-ElementLinks 모든 관계는

트랜잭션 내 변경 내용을 수행 합니다.

프로그램 코드 변경 사항이 저장소에 있으면 그렇게 내부 트랜잭션을 수행 해야 합니다.이 모든 모델 요소, 관계, 도형, 다이어그램, 및 해당 속성에 적용 됩니다.자세한 내용은 Transaction를 참조하십시오.

가장 편리한 방법은 트랜잭션 관리 사용 되는 using 문을 묶습니다는 try...catch 문을:

Store store; ...
try
{
  using (Transaction transaction =
    store.TransactionManager.BeginTransaction("update model"))
    // Outermost transaction must always have a name.
  {
    // Make several changes in Store:
    Person p = new Person(store);
    p.FamilyTreeModel = familyTree;
    p.Name = "Edward VI";
    // end of changes to Store

    transaction.Commit(); // Don't forget this!
  } // transaction disposed here
}
catch (Exception ex)
{
  // If an exception occurs, the Store will be 
  // rolled back to its previous state.
}

하나의 트랜잭션 내 변경 내용 원하는 만큼을 만들 수 있습니다.새 트랜잭션이 현재 트랜잭션 안에서 열 수 있습니다.

변경 내용을 영구적으로 유지 하려면 Commit 삭제 되기 전에 트랜잭션.트랜잭션 내에서 catch 되지 않는 예외가 발생 하는 경우 저장소 변경 이전 상태로 다시 설정 합니다.

모델 요소 만들기

기존 모델에 요소를 추가 하는이 예제:

FamilyTreeModel familyTree = ...; // The root of the model.       
using (Transaction t =
    familyTree.Store.TransactionManager
    .BeginTransaction("update model"))
{
  // Create a new model element 
  // in the same partition as the model root:
  Person edward = new Person(familyTree.Partition);
  // Set its embedding relationship:
  edward.FamilyTreeModel = familyTree;
          // same as: familyTree.People.Add(edward);
  // Set its properties:
  edward.Name = "Edward VII";
  t.Commit(); // Don't forget this!
}

이 예제에서는 요소를 만드는 방법에 대 한 이러한 중요 한 포인트를 보여 줍니다.

  • 특정 파티션을 저장소에 새 요소를 만듭니다.이 모델 요소와 관계를 있지만 않는 셰이프 기본 파티션 일반적입니다.

  • 그 대상에 포함 되는 관계를 확인 합니다.이 예제의 Dsldefinition에, 각 사람 포함 FamilyTreeHasPeople 관계의 대상 이어야 합니다.이 위해 우리 Person 개체의 FamilyTreeModel 역할 속성을 설정 하거나 FamilyTreeModel 개체의 사용자 역할 속성에는 사용자를 추가 합니다.

  • 특히 속성의 새 요소에 속성 설정 IsName Dsldefinition에 적용 됩니다.이 플래그가 요소 소유자를 고유 하 게 식별 하는 속성을 표시 합니다.이 경우 Name 속성에는 플래그가 있습니다.

  • 이 DSL의 DSL 정의 저장소에 로드 되어 있어야 합니다.메뉴 명령과 같은 확장을 작성 하는 경우이 일반적으로 이미 true입니다.다른 경우에는 명시적으로 모델을 저장소에 로드 하거나 사용할 수 있습니다 ModelBus 이 로드 합니다.자세한 내용은 방법: 프로그램 코드로 파일에서 모델 열기를 참조하십시오.

DSL를 다이어그램 (있는 경우) 셰이프 이러한 방식으로 요소를 만들 때 자동으로 만들어집니다.기본 모양, 색 및 기타 기능을 사용 하 여 자동으로 할당 된 위치에 표시 됩니다.필요한 경우 연결 된 셰이프의 위치와 방법을 표시 제어를 참조 하십시오 요소와 그 모양을 만들기.

관계 링크 만들기

DSL 정의 예제에 정의 된 두 가지 관계가 있습니다.각 관계 정의 역할 속성 클래스 관계의 양쪽 끝에 있습니다.

관계의 인스턴스를 만들 수 있습니다 세 가지가 있습니다.각 세 개의 메서드는 것과 같습니다.

  • 소스 역할 수행자의 속성을 설정 합니다.예를 들면 다음과 같습니다.

    • familyTree.People.Add(edward);

    • edward.Parents.Add(henry);

  • 대상 역할 수행자의 속성을 설정 합니다.예를 들면 다음과 같습니다.

    • edward.familyTreeModel = familyTree;

      이 역할의 복합성입니다 1..1, 우리는 값을 할당 합니다.

    • henry.Children.Add(edward);

      이 역할의 복합성입니다 0..*, 우리를 컬렉션에 추가 합니다.

  • 관계의 인스턴스를 명시적으로 생성 합니다.예를 들면 다음과 같습니다.

    • FamilyTreeHasPeople edwardLink = new FamilyTreeHasPeople(familyTreeModel, edward);

    • ParentsHaveChildren edwardHenryLink = new ParentsHaveChildren(henry, edward);

마지막 메서드는 관계에 속성을 설정 하려는 경우에 유용 합니다.

이러한 방식으로 요소를 만들 때 커넥터 다이어그램에서 자동으로 만들어지는 있지만 기본 모양, 색 및 기타 기능이 있습니다.연결 된 커넥터를 만드는 방법을 제어 하려면를 참조 하십시오 요소와 그 모양을 만들기.

요소 삭제

호출 하 여 요소를 삭제 합니다. Delete():

henry.Delete();

또한이 작업을 삭제 합니다.

  • 관계 링크 요소를 합니다.예를 들어, edward.Parents 포함 됩니다 더 이상 henry.

  • 요소에는 역할에 있는 PropagatesDelete 플래그가 true입니다.예를 들어, 요소를 표시 합니다. 셰이프는 삭제 됩니다.

기본적으로 모든 포함 관계 있는 PropagatesDelete 대상 역할에 true로 지정 합니다.삭제 henry 삭제 하지 않습니다는 familyTree, 하지만 familyTree.Delete() 모두 삭제 하는 Persons.자세한 내용은 삭제 동작 사용자 지정를 참조하십시오.

기본적으로 PropagatesDelete 참조 관계 역할에 대 한 사실이 아닙니다.

삭제 규칙 개체를 삭제할 때 특정 전파 생략 될 수 있습니다.이 요소에 대 한 다른 대체 되는 경우에 유용 합니다.사용자 삭제가 전파 수 해야 하는 하나 이상의 역할의 GUID를 제공 합니다.관계 클래스의 GUID는 가져올 수 있습니다.

henry.Delete(ParentsHaveChildren.SourceDomainRoleId);

(이 특정 예제에서는 적용 되지 않습니다 때문에 것이 PropagatesDelete 입니다 false 의 역할에는 ParentsHaveChildren 관계입니다.)

경우에 따라 삭제 잠금, 전파에 의해 삭제 될 수 있는 요소 또는 요소의의 존재에 의해 수 없습니다.사용할 수 있는 element.CanDelete() 요소를 삭제할 수 있는지 여부를 확인 합니다.

관계 링크 삭제

역할 속성에서 요소를 제거 하면 관계에 대 한 링크를 삭제할 수 있습니다.

henry.Children.Remove(edward); // or:

edward.Parents.Remove(henry); // or:

또한 링크를 명시적으로 삭제할 수 있습니다.

edwardHenryLink.Delete();

이러한 세 가지 방법 모두 동일한 효과 가집니다.그 중 하나를 사용 해야 합니다.

0에서 1까지 또는 1 복합성의 역할에 있는 경우 설정할 수 있습니다 null, 또는 다른 값으로:

edward.FamilyTreeModel = null;/ / 또는.

edward.FamilyTreeModel = anotherFamilyTree;

관계 있는 링크 순서 바꾸기

원본 또는 대상에 대 한 특정 모델 요소를 특정 관계의 링크는 특정 시퀀스가 있습니다.추가 된 순서 대로 표시 됩니다.예를 들어,이 문을 항상 자식 같은 순서로 생성 됩니다.

foreach (Person child in henry.Children) ...

연결의 순서를 변경할 수 있습니다.

ParentsHaveChildren link = GetLink(henry,edward);

ParentsHaveChildren nextLink = GetLink(henry, elizabeth);

DomainRoleInfo role =

link.GetDomainRelationship().DomainRoles[0];

link.MoveBefore(role, nextLink);

잠금

잠금으로 변경 하지 못할 수 있습니다.잠금은 개별 요소, 파티션 및 저장소를 설정할 수 있습니다.수준을 확인 하려는 변경 유형을 방지 하는 잠금을 있으면이 시도 하면 예외가 throw 될 수 있습니다.요소를 사용 하 여 잠금 설정 되어 있는지 여부를 검색할 수 있습니다.정의 된 확장 메서드는 GetLocks() Immutability.

자세한 내용은 잠금 정책을 정의하여 읽기 전용 세그먼트 만들기를 참조하십시오.

복사 및 붙여넣기

요소 또는 그룹의 요소를 복사할 수 있는 IDataObject:

Person person = personShape.ModelElement as Person;
Person adopter = adopterShape.ModelElement as Person;
IDataObject data = new DataObject();
personShape.Diagram.ElementOperations
      .Copy(data, person.Children.ToList<ModelElement>());

요소 serialize 된 요소 그룹으로 저장 됩니다.

모델에 요소는 IDataObject에서 병합할 수 있습니다.

using (Transaction t = targetDiagram.Store.
        TransactionManager.BeginTransaction("paste"))
{
  adopterShape.Diagram.ElementOperations.Merge(adopter, data);
}

Merge ()하나 받아들일 수는 PresentationElement 또는 ModelElement.이 알 경우는 PresentationElement, 세 번째 매개 변수는 대상 다이어그램에서 위치를 지정할 수도 있습니다.

탐색 및 다이어그램 업데이트

DSL에 사람, 노래 하는 개념을 나타내는 도메인 모델 요소를 별도의 다이어그램에 표시 되는 내용 나타내는 도형 요소입니다.도메인 모델 요소의 중요 한 속성과 관계의 개념을 저장합니다.도형 요소의 크기, 위치 및 개체의 보기에는 다이어그램의 색과 그 구성 요소 들의 레이아웃을 저장합니다.

Cc512845.collapse_all(ko-kr,VS.110).gif프레젠테이션 요소

기본 모양 및 요소 형식의 클래스 다이어그램

DSL 정의에 지정한 각 요소가 다음 표준 클래스 중 하나에서 파생 되는 클래스를 만듭니다.

요소 종류

기본 클래스

도메인 클래스

ModelElement

도메인 관계

ElementLink

모양

NodeShape

커넥터

BinaryLinkShape

다이어그램

Diagram

다이어그램에서 요소를 일반적으로 모델 요소를 나타냅니다.일반적으로 (그러나 항상)는 NodeShape 도메인 클래스 인스턴스를 나타내는 a BinaryLinkShape 도메인 관계 인스턴스를 나타냅니다.PresentationViewsSubject 관계 모델 요소를 나타내는 노드 또는 링크 셰이프에 연결 합니다.

일부 노드 또는 링크 셰이프에 하나의 다이어그램에 속합니다.이진 링크 모양 두 노드 셰이프를 연결 합니다.

도형이 자식 도형 두 집합에서 가질 수 있습니다.도형에는 NestedChildShapes 집합 경계 상자는 부모에 한정 됩니다.도형에는 RelativeChildShapes 목록의 상위 – 예를 들어 레이블 또는 포트의 범위를 벗어난 나타날 수 바깥쪽 또는 부분적으로 합니다.다이어그램에는 RelativeChildShapes 및 Parent.

Cc512845.collapse_all(ko-kr,VS.110).gif셰이프 및 요소 간 이동

도메인 모델 요소 및 요소의 모양으로 관련 있는 PresentationViewsSubject 관계.

// using Microsoft.VisualStudio.Modeling;
// using Microsoft.VisualStudio.Modeling.Diagrams;
// using System.Linq;
Person henry = ...;
PersonShape henryShape = 
  PresentationViewsSubject.GetPresentation(henry)
    .FirstOrDefault() as PersonShape;

관계 관계 다이어그램 연결선으로 연결:

Descendants link = Descendants.GetLink(henry, edward);
DescendantConnector dc =
   PresentationViewsSubject.GetPresentation(link)
     .FirstOrDefault() as DescendantConnector;
// dc.FromShape == henryShape && dc.ToShape == edwardShape

이 관계를 다이어그램으로 모델의 루트 연결 참고:

FamilyTreeDiagram diagram = 
   PresentationViewsSubject.GetPresentation(familyTree)
      .FirstOrDefault() as FamilyTreeDiagram;

도형으로 표시 하는 모델 요소를 사용 하십시오.

henryShape.ModelElement as Person

diagram.ModelElement as FamilyTreeModel

Cc512845.collapse_all(ko-kr,VS.110).gif다이어그램 주위를 탐색합니다.

일반적 도형과 연결선 다이어그램 사이 이동 하는 것이 아닙니다.다이어그램의 모양에서 작동 하는 데 필요한 경우에 도형 및 연결선 사이의 이동 모델에서 관계를 탐색 하는 것이 좋습니다.이러한 메서드 셰이프의 양 끝에 연결선을 연결 하십시오.

personShape.FromRoleLinkShapes, personShape.ToRoleLinkShapes

connector.FromShape, connector.ToShape

많은 셰이프가 합성 수 있습니다. 이들은 부모 셰이프 및 자식 레이어를 하나 이상 구성 됩니다.셰이프가 다른 셰이프를 기준으로 배치 된 모래는 어린이.부모 셰이프를 이동할 때 자식 함께 이동 합니다.

상대 자식 부모 셰이프를 테두리 상자 바깥에 표시 될 수 있습니다.중첩 된 자식 부모 범위 안에 나타나는 엄격 하 게 합니다.

위 다이어그램에서 셰이프 집합을 가져오려면 다음을 사용 하십시오.

Diagram.NestedChildShapes

셰이프와 연결선의 상위 클래스는 다음과 같습니다.

ModelElement

-- PresentationElement

-- ShapeElement

----- NodeShape

------- Diagram

------- YourShape

----- LinkShape

------- BinaryLinkShape

--------- YourConnector

Cc512845.collapse_all(ko-kr,VS.110).gif셰이프와 연결선의 속성

대부분의 경우 셰이프를 명시적으로 변경할 수 없습니다.모델 요소를 변경 하면 "수정" 규칙이 도형과 연결선을 업데이트 합니다.자세한 내용은 변경 내용에 대한 대응 및 전파를 참조하십시오.

그러나 일부 명시적 모델 요소에 독립적입니다 등록 정보에서 변경 하는 것이 유용 합니다.예를 들어 이러한 속성을 변경할 수 있습니다.

  • Size-높이 및 도형 너비를 결정 합니다.

  • Location-위치를 기준으로 상위 도형 또는 다이어그램

  • StyleSet-펜과 커넥터를 그리는 데 사용 되는 브러시의 집합

  • Hide-도형 보이지 않습니다

  • Show-셰이프를 한 후 볼 수 있게 한Hide()

Cc512845.collapse_all(ko-kr,VS.110).gif요소 및 해당 셰이프 만들기

요소를 만들고 포함 관계 트리에 연결 하는 경우 셰이프 자동으로 만들어지고 연결 된.이 트랜잭션의 끝에서 실행은 "수정" 규칙에 의해 수행 됩니다.그러나 셰이프는 자동으로 지정 된 위치에 표시 됩니다 및 모양, 색 및 다른 기능의 기본값을 갖게 됩니다.셰이프를 만드는 방법을 제어 하려면 병합 기능을 사용할 수 있습니다.먼저는 Elementgroup에 추가할 요소를 추가 하 고 그룹 다이어그램으로 병합 해야 합니다.

이 메서드의 기능은 다음과 같습니다.

  • 이름, 속성 요소 이름으로 지정한 경우 설정 합니다.

  • DSL 정의에 지정 된 모든 요소가 병합 지시문을 따릅니다.

이 예제 다이어그램을 두 번 클릭할 때 마우스 위치에 있는 셰이프를 만듭니다.DSL 정의이 샘플에 FillColor 속성의 ExampleShape 노출 된.

  using Microsoft.VisualStudio.Modeling;
  using Microsoft.VisualStudio.Modeling.Diagrams;
  partial class MyDiagram
  {
    public override void OnDoubleClick(DiagramPointEventArgs e)
    {
      base.OnDoubleClick(e);

      using (Transaction t = this.Store.TransactionManager
          .BeginTransaction("double click"))
      {
        ExampleElement element = new ExampleElement(this.Store);
        ElementGroup group = new ElementGroup(element);
         
        { // To use a shape of a default size and color, omit this block.
          ExampleShape shape = new ExampleShape(this.Partition);
          shape.ModelElement = element;
          shape.AbsoluteBounds = new RectangleD(0, 0, 1.5, 1.0);
          shape.FillColor = System.Drawing.Color.Azure;
          group.Add(shape);
        }

        this.ElementOperations.MergeElementGroupPrototype(
          this,
          group.CreatePrototype(),
          PointD.ToPointF(e.MousePosition));
        t.Commit();
      }
    }
  }

도형이 두 개 이상 지정 하면 상대 위치를 사용 하 여 해당 설정에 AbsoluteBounds.

색 및 다른 노출 된 속성을이 메서드를 사용 하 여 커넥터를 설정할 수도 있습니다.

Cc512845.collapse_all(ko-kr,VS.110).gif트랜잭션 사용

도형, 연결선 및 다이어그램의 하위 형식입니다 ModelElement 및 라이브를 저장소에 저장 합니다.따라서 하는 트랜잭션 내 에서만 변경 해야 합니다.자세한 내용은 방법: 트랜잭션을 사용하여 모델 업데이트를 참조하십시오.

문서 보기 및 문서 데이터

표준 다이어그램 형식의 클래스 다이어그램

파티션 저장소

모델을 로드 하면 해당 다이어그램 동시에 로드 됩니다.일반적으로 모델 store.defaultpartition에 로드 되 고 다이어그램 내용을 다른 파티션에 로드 됩니다.일반적으로 각 파티션의 내용이 로드 되어 별도 파일로 저장 합니다.

참고 항목

참조

ModelElement

개념

도메인별 언어에서 유효성 검사

방법: 트랜잭션을 사용하여 모델 업데이트

Visual Studio Modelbus를 사용하여 모델 통합

기타 리소스

도메인별 언어에서 코드 생성

변경 내용에 대한 대응 및 전파