0

는 [나는 내가 찾은 답을 반영하기 위해 제목을 업데이트하지만, 변경되지 않은 질문 텍스트 떠날거야]이 기본적으로 How to output namespace in T4 templates?과 같은 질문자동으로 사전 생성 뷰

을하지만, 모든 답변 Visual Studio 호스트에 대한 액세스가 필요합니다. GradthJ의 대답에 Brad Wilson이 언급 했으므로이 답변은 Visualization and Modeling SDK을 통해 MSBuild 호스트에서 작동하지 않습니다.

최종 목표는 미리 생성 된보기를 edmx 파일에 추가하는 것입니다. VS에는 foo.edmx에서 foo.tt 및 foo.Context.tt 로의 하드 코딩 된 내부 연결이있는 것 같습니다. 프로젝트 파일에서 < DependentUpon> foo.edmx 임에도 불구하고 foo.edmx를 변경해도 foo.Views.tt가 해당 변환을 실행하지 않습니다.

V & M SDK를 사용하면 부모가 변경 될 때 종속 텍스트 변환이 실행되지만 모든 네임 스페이스는 엔티티 클래스 파일에서 제거됩니다. EF.Utility.CS.ttinclude는 namespaceHint가 없으면 null 네임 스페이스를 반환하고 VS 호스트를 사용합니다. MSBuild 프로젝트에서 $ (DevEnvDir)에 대한 종속성을 원하지 않기 때문에 EF.Utility.CS.ttinclude를 소스 제어 폴더에 복사했으며 MSBuild 변환 호스트에 맞게 변경했습니다.

CallContext.LogicalGetData("NamespaceHint") 또는 Host.ResolveParameterValue("", "", "namespaceHint")에 의해 반환 된 동일한 문자열을 검색하려고합니다. 현재 계획에는 $ (RootNamespace) 및 $ (ProjectDir)을 < T4ParameterValues>를 통해 전달하고 ResolveParameterValue를 사용하여 t4에서 검색 한 다음 ProjectDir을 기준으로 .tt 파일의 디렉터리를 가져 와서 슬래시를 마침표로 변환 한 다음 RootNamespace로 연결합니다. 추악하지만 이론적으로는 효과가있을 것입니다.

나는 다음 중 하나를 찾고 있어요 :

  • 방법을 V & M SDK, 더 간단하게보다 위에 설명 된 연결을 통해 비주얼 스튜디오의 NamespaceHint와 같은 값을 검색 할 수 있습니다.
  • V 자 & M의 SDK
  • V 자에 의해 처리되는 foo.tt foo.Context.tt 및 배제 방법을 사용하지 않고 foo.edmx 및 foo.arbitrary.tt간에 적절한 종속성을 설정하는 방법 & M SDK는 VS의 기본 제공 엔티티 프레임 워크 도구로 계속 처리됩니다.

어느 쪽이든 이전보다 약간 더 좋을 수도 있지만 지금까지 내 연구에 따르면 가능하지 않다는 것을 나타냅니다. 내 현재 접근 방식은 텍스트 변환을 두 번 실행합니다. VS가 edmx 처리를 하드 코드 한 다음 V & M SDK가 일반 tt 처리를 수행합니다. 나는 그 중 하나에 대해 정말 좋은 대답을 얻으면 나는 후손에 대한 질문 제목을 바꿀 것이다. Getting the namespace for an edmx in a T4 template

답변

2

VS에는 foo.edmx와 foo.tt 및 foo.Context.tt의 하드 코드 된 내부 연결이있는 것으로 보입니다.은 실제로 사실이 아닙니다. 연결은 하드 코드되지 않습니다. 실제로는 edmx를 저장할 때 T4 생성을 트리거링 할 수있는 매우 간단한 해킹이 있습니다. edmx 파일의 이름을 템플릿의 아무 곳에 나 넣기 만하면됩니다. 그래서 저는 변환 할 때마다 발생하기 시작 난 그냥 단지

// Model1.edmx 

퍼팅하면 T4 템플릿에 edmx 파일에 T4 템플릿을 결합하고 (그냥 코멘트의 통지) 것을 보여 주었다이 here에 대해 좀 더 정교 edmx 파일이 저장되었습니다.

+0

흥미 롭습니다. "/// edmx 파일 찾기"로직을 미리 생성 된 뷰 템플릿에서 제거하고 명시 적으로 edmx를 지정해야하는 것처럼 들립니다. – Timbo

+0

이 방법이 작동하는지 확인합니다. 이제 edmx 처리 만 소스 제어에 제대로 연결됩니다. – Timbo

+0

@Timbo - 네, 그렇게 할 수는 있지만 전체 경로 (여전히 작동해야 함)를 지정해야 할 수도 있습니다. – Pawel

0

내가 필요 이상으로 자신에 열심히이 길을 만들고 있었다 :

이 질문에

도 유사하다.

내가 경로에 내 개체 모델에 미리 생성 뷰를 추가 내 .csproj로 만드는 데 필요한 변경의 전체입니다 \에 \ foo.edmx :

<ItemGroup> 
    <Compile Include="path\to\foo.Views.cs"> 
     <AutoGen>True</AutoGen> 
     <DesignTime>True</DesignTime> 
     <DependentUpon>foo.Views.tt</DependentUpon> 
    </Compile> 
    <T4Transform Include="path\to\foo.Views.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>foo.Views.cs</LastGenOutput> 
     <DependentUpon>foo.edmx</DependentUpon> 
    </T4Transform> 
    </ItemGroup> 
    <Target Name="GenerateViews" BeforeTargets="EntityDeploy"> 
    <CallTarget Targets="ExecuteTransformations" /> 
    </Target> 
    <Import Project="$(ExternalLibrariesFolder)\TextTemplateTransformationToolkit\Microsoft.TextTemplating.targets" /> 

foo.Views.tt 인 EF4/EF5 Model/Database First View Gen .tt for C#