【问题标题】:Automatically pre-generate views in entity framework在实体框架中自动预生成视图
【发布时间】:2014-05-05 18:01:25
【问题描述】:

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

这与How to output namespace in T4 templates? 基本上是同一个问题,但那里的所有答案都依赖于访问 Visual Studio 主机。正如 Brad Wilson 在 GarethJ 的回答中所做的那样,这些答案在 MSBuild 主机中通过 Visualization and Modeling SDK 不起作用。

我的最终目标是将预生成的视图添加到 edmx 文件中。似乎 VS 具有从 foo.edmx 到 foo.tt 和 foo.Context.tt 的硬编码内部关联。对 foo.edmx 的更改不会触发我的 foo.Views.tt 运行其转换,即使它是项目文件中的 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") 返回的相同字符串。我目前的计划包括:通过 传递 $(RootNamespace) 和 $(ProjectDir) 并使用 ResolveParameterValue 在 t4 中检索它们,然后获取相对于 ProjectDir 的 .tt 文件目录并将斜杠转换为句点,然后连接到 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

【问题讨论】:

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


    【解决方案1】:

    这个似乎VS有一个从foo.edmx到foo.tt和foo.Context.tt的硬编码内部关联。实际上是不正确的。该关联本身并不是硬编码的 - 实际上有一个非常简单的 hack,允许在保存 edmx 时触发 any T4 生成。只需将 edmx 文件的名称放在模板中的任何位置即可。我详细说明了这个here,我刚刚展示了只是把

    // Model1.edmx 
    

    (注意它只是一个注释)在 T4 模板中将 T4 模板绑定到 edmx 文件,因此每次保存 edmx 文件时都会开始转换。

    【讨论】:

    • 有趣。听起来我应该从(您的?)预生成的视图模板中删除“//查找 edmx 文件”逻辑并明确指定 edmx。
    • 确认这有效。现在,只要 edmx 处理正确连接到源代码控制。
    • @Timbo - 是的,您可以尝试这样做,但您可能需要指定完整路径(应该仍然有效)。
    【解决方案2】:

    我让自己变得更加困难。

    这是我需要对我的 .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# 的副本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多