Entity framework 在实体框架中自动预生成视图
[我正在更新标题以反映我找到的答案,但保留问题文本不变] 这与问题基本相同,但所有答案都依赖于访问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转换主机 我想检索由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
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的内置实体框架工具处理的方法
这个问题也类似于:我用这种方式对自己施加了不必要的压力 这是我需要对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-是的,您可以尝试这样做,但您可能需要指定完整路径(该路径仍然有效)。