2016-08-10 3 views
1

엔터티 데이터 모델이 업데이트되거나 생성 된 후 어떤 작업을 수행하는 IModelGenerationExtension을 확장하는 VSIX 확장을 작성하고 있습니다. 이 이후ProjectItem의 네임 스페이스 얻기

public class ModelGenerationExtension : IModelGenerationExtension 
{ 
    public void OnAfterModelGenerated(ModelGenerationExtensionContext context) 
    { 
    } 
    public void OnAfterModelUpdated(UpdateModelExtensionContext context) 
    { 
     //need namespace of context.ProjectItem here 
    } 
} 

엔티티 데이터 모델에서 작동되면, context.ProjectItem는 .edmx 파일이있을 것이다 -의이 Model1.edmx를 호출 할 수 있습니다. 이 파일에는 Model1.tt이라는 파일이 포함되며이 파일에는 각각 엔터티에 연결된 .cs 파일이 중첩되어 있습니다.

ProjectItem에서이 .cs 파일 중 하나의 네임 스페이스를 가져와야합니다. (모든 엔티티는 동일한 네임 스페이스에 있습니다.)

enter image description here

나는 이것에 대해 어떻게 갈 수 있나요?

답변

1

VS 확장을 개발 한 이래로 얼마 전 이었지만 이전 코드를 검색하는 방법을 살펴 보았습니다. 어쩌면이 새로운 기술은 오늘날, 그러나 이것은 내가 아는 것입니다 : 처음에는

당신이 * .cs 파일을 찾을 당신이 당신의 Model1.edmx에 대한받은 항목의 자식 ProjectItems을 반복하여 올바른 파일을 찾을 수 있어야합니다

CodeNamespace nsp = cs.FileCodeModel.CodeElements.Cast<CodeElement>(). 
      OfType<CodeNamespace>().First(); 

을 그리고 거기 당신은 당신의 네임 스페이스 요소가 있어야합니다

ProjectItem tt = context.ProjectItem.ProjectItems.OfType<ProjectItem>() 
         .FirstOrDefault(item => item.Name == "Model1.tt"); 

ProjectItem cs = tt.ProjectItems.OfType<ProjectItem>() 
         .FirstOrDefault(item => item.Name.EndsWith(".cs")); 

그런 다음 첫 번째 네임 스페이스 구성 검색이 ProjectItem csFileCodeModel를 사용할 수 있습니다. CodeNamespace은 속성이 Name이고 FullName입니다.

나는이 코드를 이전 코드에서 읽었지만 지금은 테스트하지 못했습니다. 오류 처리 기능을 추가해야하며 파일 계층 구조가 설명 된대로 실제로는 ProjectItems 계층 구조에 재현되어 있는지 100 % 확신 할 수 없습니다.

+0

감사합니다! – Adrian

관련 문제