在实体框架中自动预生成视图

时间:2014-03-27 00:51:33

标签: entity-framework visual-studio msbuild code-generation t4

[我正在更新标题以反映我找到的答案,但保留问题文字不变]

这与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。丑陋但理论上它会起作用。

我正在寻找以下其中一项:

  • 通过V& M SDK检索与Visual Studio的NamespaceHint相同的值的方法,比上述连接更简单。
  • 在不使用V& M SDK的情况下在foo.edmx和foo.arbitrary.tt之间设置正确依赖关系的方法
  • 一种方法,用于排除foo.tt和foo.Context.tt被V& M SDK处理,同时仍由VS的内置实体框架工具处理。

后者中的任何一个都会略微优于前者,但到目前为止,我的研究表明它们是不可能的。我目前的方法是两次运行文本转换:VS执行硬编码edmx处理,然后V& M SDK执行通用tt处理。如果我对其中任何一个得到了非常好的答案,我会为后代更改问题标题。

此问题也类似于:Getting the namespace for an edmx in a T4 template

2 个答案:

答案 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#

的副本