[我正在更新标题以反映我找到的答案,但保留问题文字不变]
这与How to output namespace in T4 templates?基本相同,但所有答案都依赖于访问Visual Studio主机。正如Brad Wilson在GarethJ的回答中所评论的那样,这些答案在Visualization and Modeling SDK的MSBuild主机中不起作用。
我的最终目标是将预生成的视图添加到edmx文件中。似乎VS有一个硬编码的内部关联,从foo.edmx到foo.tt和foo.Context.tt。对foo.edmx的更改不会触发我的foo.Views.tt来运行其转换,即使它是< DependentUpon>项目文件中的foo.edmx。
使用V& M SDK会导致相关文本转换在父更改时运行,但所有命名空间都会从实体类文件中删除。 EF.Utility.CS.ttinclude依赖于VS主机,如果找不到namespaceHint,则返回null命名空间。 由于我也不想在我的MSBuild项目中依赖$(DevEnvDir),我已经将EF.Utility.CS.ttinclude复制到源控制文件夹并且正在改变它以适应MSBuild转换主机。
我想检索CallContext.LogicalGetData("NamespaceHint")
或Host.ResolveParameterValue("", "", "namespaceHint")
返回的相同字符串。我目前的计划涉及:通过< T4ParameterValues>传递$(RootNamespace)和$(ProjectDir)。并使用ResolveParameterValue在t4中检索它们,然后获取.tt文件相对于ProjectDir的目录并将斜杠转换为句点,然后连接到RootNamespace。丑陋但理论上它会起作用。
我正在寻找以下其中一项:
后者中的任何一个都会略微优于前者,但到目前为止,我的研究表明它们是不可能的。我目前的方法是两次运行文本转换:VS执行硬编码edmx处理,然后V& M SDK执行通用tt处理。如果我对其中任何一个得到了非常好的答案,我会为后代更改问题标题。
答案 0 :(得分:2)
这个似乎VS有一个硬编码的内部关联,从foo.edmx到foo.tt和foo.Context.tt。实际上不是真的。该关联本身并不是硬编码的 - 实际上有一个非常简单的黑客攻击,允许在保存edmx时触发任何 T4代。只需将edmx文件的名称放在模板中的任何位置即可。我详细阐述了这个here,我只是展示了
// Model1.edmx
T4模板中的(注意它只是一个注释)将T4模板绑定到edmx文件,因此每次保存edmx文件时都会发生转换。
答案 1 :(得分:0)
我对自己的这种做法比必要时更难。
这是我需要对.csproj进行的所有更改,以便在path \ to \ 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#
的副本