T4模板错误:加载包含文件ef.utility.cs.ttinclude返回null或空字符串
我已经覆盖了控制器生成T4模板( ControllerWithContext.tt
),如此处所述。
我想利用在POCO模型生成器T4模板中使用的EF.utility.CS.ttinclude
中的代码帮助程序实用程序。 因此,我Model.tt
从我的Model.tt
复制到我的ControllerWithContext.tt
。
但是,当我尝试添加控制器时,我收到错误消息
加载包含文件’EF.utility.CS.ttinclude’返回null或空字符串
根据MSDN文档 ,这个错误是因为包含的文件是空白的,显然不是因为它适用于Model.tt
我能看到的唯一区别是被覆盖的ControllerWithContext.tt
没有定义自定义工具,而Model.tt
将它设置为TextTemplatingFileGenerator
。
我的解决方法是将我需要的函数从ef.utility.cs.ttinclude
到我的ControllerWithContext.tt
,它本身会抛出更多错误,但很容易解决。
如何在未定义自定义工具的情况下包含T4模板?
按照@DustinDavis的建议,并使用OlegSych网站上的宝贵信息,这就是我所做的:
- 创建了一个名为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="
为" #> using
; - 删除了开始和结束
<#+ #>
-
using Microsoft.VisualStudio.TextTemplating;
添加了指令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中的辅助方法,并且我有办法添加我自己的帮助方法,这些方法将可用于所有项目。
如果您有Visual Studio 2012或2013,请安装此EF工具以解决该错误。
答案是模板处理器甚至没有尝试获取包含文件(使用ProcMon确认)。 您可以使用任何模板重现此操作,而不仅仅是EF.Utility.CS.ttinlcude
不确定为什么需要代码但是你总是可以构建自己的基类,只需从Microsoft.VisualStudio.TextTemplating.TextTransformationinheritance它,然后放入EF.Utility文件中的所有代码。 然后将inherits指令设置为指向新的基类,然后您可以从模板中访问这些方法。