Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在实体框架中自动预生成视图_Entity Framework_Visual Studio_Msbuild_Code Generation_T4 - Fatal编程技术网

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

Entity framework 在实体框架中自动预生成视图,entity-framework,visual-studio,msbuild,code-generation,t4,Entity Framework,Visual Studio,Msbuild,Code Generation,T4,[我正在更新标题以反映我找到的答案,但保留问题文本不变] 这与问题基本相同,但所有答案都依赖于访问VisualStudio主机。正如Brad Wilson在GarethJ的答案中所评论的,这些答案在MSBuild主机中无法通过 我的最终目标是将预生成的视图添加到edmx文件中。似乎VS有一个硬编码的内部关联,从foo.edmx到foo.tt和foo.Context.tt。对foo.edmx的更改不会触发myfoo.Views.tt运行其转换,即使它在项目文件中是foo.edmx 使用V&msdk

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

这与问题基本相同,但所有答案都依赖于访问VisualStudio主机。正如Brad Wilson在GarethJ的答案中所评论的,这些答案在MSBuild主机中无法通过

我的最终目标是将预生成的视图添加到edmx文件中。似乎VS有一个硬编码的内部关联,从foo.edmx到foo.tt和foo.Context.tt。对foo.edmx的更改不会触发myfoo.Views.tt运行其转换,即使它在项目文件中是foo.edmx

使用V&msdk会在父级更改时运行依赖文本转换,但所有名称空间都会从实体类文件中剥离出来。EF.Utility.CS.ttinclude依赖于VS主机,如果找不到namespaceHint,则返回空命名空间。 由于我也不希望MSBuild项目中存在对$(DevEnvDir)的依赖关系,因此我已将EF.Utility.CS.ttinclude复制到一个受源代码控制的文件夹中,并正在对其进行修改以适合MSBuild转换主机

我想检索由
CallContext.LogicalGetData(“NamespaceHint”)
或由
Host.ResolveParameterValue(“,”,“NamespaceHint”)
返回的相同字符串。我当前的计划包括:通过传递$(RootNamespace)和$(ProjectDir)并使用ResolveParameterValue在t4中检索它们,然后获取.tt文件相对于ProjectDir的目录,并将斜杠转换为句点,然后连接到RootNamespace。丑陋,但理论上它会起作用

我正在寻找以下内容之一:

  • 通过V&MSDK检索与VisualStudio的NamespaceHint相同的值的方法,比上面描述的连接更简单
  • 在不使用V&M SDK的情况下,在foo.edmx和foo.arbitral.tt之间设置适当依赖关系的方法
  • 将foo.tt和foo.Context.tt排除在V&M SDK处理之外,同时仍由VS的内置实体框架工具处理的方法
后者中的任何一个都比前者略好,但到目前为止,我的研究表明它们是不可能的。我当前的方法运行两次文本转换:VS执行硬编码的edmx处理,然后V&MSDK执行一般的tt处理。如果我对这两个问题都有一个很好的答案,我将为后代更改问题的标题


这个问题也类似于:

我用这种方式对自己施加了不必要的压力

这是我需要对my.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" />

看来VS有一个硬编码的内部关联,从foo.edmx到foo.tt和foo.Context.tt。事实并非如此。关联本身不是硬编码的-实际上有一个非常简单的hack,它允许在保存edmx时触发任何T4生成。只需将edmx文件的名称放在模板中的任意位置。我对此做了更多的阐述,我只是展示了

// Model1.edmx 

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

。听起来我应该从(您的?)预生成的视图模板中去掉“//Find the edmx file”逻辑,并显式指定edmx。确认此操作有效。现在,如果只有edmx处理正确地连接到源代码管理中。@Timbo-是的,您可以尝试这样做,但您可能需要指定完整路径(该路径仍然有效)。