T4模板错误:加载包含文件ef.utility.cs.ttinclude返回null或空字符串

时间:2011-11-10 11:33:13

标签: c# visual-studio-2010 t4

我已按照here所述覆盖了控制器生成T4模板(ControllerWithContext.tt)。
我想利用POCO模型生成器T4模板中使用的EF.utility.CS.ttinclude中的代码帮助程序实用程序。因此,我将Model.tt中的以下行复制到我的ControllerWithContext.tt

<#@ include file="EF.Utility.CS.ttinclude"#>

但是,当我尝试添加控制器时,我收到错误消息

  

加载包含文件'EF.utility.CS.ttinclude'返回null或空字符串

根据MSDN documentation,此错误是因为包含的文件是空白的,显然不是因为它适用于Model.tt

我能看到的唯一区别是被覆盖的ControllerWithContext.tt没有定义自定义工具,而Model.tt将其设置为TextTemplatingFileGenerator

我的解决方法是将我需要的功能从ef.utility.cs.ttinclude复制到我的ControllerWithContext.tt,这本身就会产生更多错误但很容易解决。

如何在未定义自定义工具的情况下包含T4模板?

3 个答案:

答案 0 :(得分:10)

按照@DustinDavis的建议,并使用OlegSych's site上的宝贵信息,这就是我所做的:

  • 创建了一个名为CodeGenerationTools的新项目。
  • 添加了对

    的项目引用
    • System.Data.Entity.Design
    • EnvDTE
    • System.Data.Entity的
    • Microsoft.VisualStudio.TextTemplating.10.0

    对于最后一个引用,我必须安装正确版本的Visual Studio SDK

  • 将EF.Utility.CS.ttinclude文件复制到项目中。
  • 将其重命名为CodeGenerationTools.cs
  • 修改了该文件并将所有<#@ import namespace="<name>" #>转换为using <name>;
  • 删除了开始和结束<#+ #>
  • 添加了指令using Microsoft.VisualStudio.TextTemplating;
  • 扩展课程:

    public class CodeGenerationTools : TextTransformation
    
  • 覆盖TransformText方法

    public override string TransformText() {
        throw new NotImplementedException();
    }
    
  • 添加了空构造函数

    public CodeGenerationTools() {
        _textTransformation = DynamicTextTransformation.Create(this);
        _code = new CSharpCodeProvider();
        _ef = new MetadataTools(_textTransformation);
        FullyQualifySystemTypes = false;
        CamelCaseFields = true;
    }
    
  • 最后,构建这个项目。

接下来的步骤发生在主项目中 - 编辑了T4模板文件。 - 将模板指令更改为

    <#@ template language="C#" HostSpecific="True" debug="false" inherits="CodeGenerationTools"#>

- 添加了指令

    <#@ assembly name="C:\Visual Studio 2010\Projects\CodeGenerationTools\CodeGenerationTools\bin\Debug\CodeGenerationTools.dll" #>
    <#@ import namespace="CodeGenerationTools" #>

所有这些现在意味着我可以在我自己的T4模板中使用EF.Utility.CS.ttinclude中的辅助方法,并且我有办法添加我自己的帮助方法,这些方法将可用于所有项目。

答案 1 :(得分:4)

如果您有Visual Studio 2012或2013,请安装this EF tool以解决错误。

答案 2 :(得分:2)

答案是模板处理器甚至没有尝试获取包含文件(使用ProcMon确认)。您可以使用任何模板重现此操作,而不仅仅是EF.Utility.CS.ttinlcude

不确定为什么需要代码但是你总是可以构建自己的基类,只需从Microsoft.VisualStudio.TextTemplating.TextTransformation继承它,然后放入EF.Utility文件中的所有代码。然后将inherits指令设置为指向新的基类,然后可以从模板中访问这些方法。