I have overridden the controller generation T4 templates (ControllerWithContext.tt
) as described here.
I would like to take advantage of the code helper utilities found in EF.utility.CS.ttinclude
as used in the POCO model generator T4 template. Therefore I copied the following lines from my Model.tt
to my ControllerWithContext.tt
.
<#@ include file="EF.Utility.CS.ttinclude"#>
However, when I try to add a controller I am getting the error message
Loading the include file 'EF.utility.CS.ttinclude' returned a null or empty string
According to the MSDN documentation, this error is because the included file is blank, which it clearly isn't because it works with Model.tt
The only difference I can see is that the overridden ControllerWithContext.tt
does not have a Custom Tool defined, whereas the Model.tt
has it set to TextTemplatingFileGenerator
.
My workaround is to copy the functions I need from ef.utility.cs.ttinclude
into my ControllerWithContext.tt
, which in itself threw up more errors but which were easily solved.
How can I include T4 templates without a custom tool defined?
Following @DustinDavis' advice, and using the invaluable information found on OlegSych's site, here's what I did:
Added project references to
For this last reference I had to install the correct version of the Visual Studio SDK
<#@ import namespace="<name>" #>
to using <name>;
<#+ #>
using Microsoft.VisualStudio.TextTemplating;
Extended the class:
public class CodeGenerationTools : TextTransformation
Override the TransformText
method
public override string TransformText() {
throw new NotImplementedException();
}
Added empty constructor
public CodeGenerationTools() {
_textTransformation = DynamicTextTransformation.Create(this);
_code = new CSharpCodeProvider();
_ef = new MetadataTools(_textTransformation);
FullyQualifySystemTypes = false;
CamelCaseFields = true;
}
The next steps took place in the main project - Edited the T4 template file. - Changed template directive to
<#@ template language="C#" HostSpecific="True" debug="false" inherits="CodeGenerationTools"#>
- Added the directives
<#@ assembly name="C:\Visual Studio 2010\Projects\CodeGenerationTools\CodeGenerationTools\bin\Debug\CodeGenerationTools.dll" #>
<#@ import namespace="CodeGenerationTools" #>
All of which now means I can use the helper methods found in EF.Utility.CS.ttinclude in my own T4 templates, and I have the means to add my own helper methods which will be available to all projects.
If you have Visual Studio 2012 or 2013, install this EF tool to resolve the error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With