Ошибка шаблонов T4: загрузка включенного файла ef.utility.cs.ttinclude возвращает пустую или пустую строку
Я переопределил шаблоны T4 для создания контроллеров (ControllerWithContext.tt
), как описано здесь.
Я хотел бы воспользоваться утилитами вспомогательного кода, найденными в EF.utility.CS.ttinclude
, которые используются в шаблоне T4 генератора модели POCO. Поэтому я скопировал следующие строки из моего Model.tt
в мой ControllerWithContext.tt
.
<#@ include file="EF.Utility.CS.ttinclude"#>
Однако, когда я пытаюсь добавить контроллер, я получаю сообщение об ошибке
Загрузка включенного файла 'EF.utility.CS.ttinclude' возвращает пустую или пустую строку
В соответствии с документацией MSDN эта ошибка связана с тем, что включенный файл пуст, что явно не потому, что он работает с Model.tt
Единственное различие, которое я вижу, заключается в том, что переопределенный ControllerWithContext.tt
не имеет настраиваемого инструмента, а Model.tt
имеет значение TextTemplatingFileGenerator
.
Мое обходное решение состоит в том, чтобы скопировать нужные мне функции из EF.utility.CS.ttinclude
в my ControllerWithContext.tt
, что само по себе породило больше ошибок, но которые были легко решены.
Как включить шаблоны T4 без определенного инструмента?
Ответы
Ответ 1
Следуя советам @DustinDavis и используя бесценную информацию, найденную на сайте OlegSych, вот что я сделал:
- Создал новый проект под названием CodeGenerationTools.
-
Добавлены ссылки на
- System.Data.Entity.Design
- EnvDTE
- System.Data.Entity
- Microsoft.VisualStudio.TextTemplating.10.0
Для этой последней ссылки мне пришлось установить правильную версию SDK Visual Studio
- Скопировал файл 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" #>
Теперь все это означает, что я могу использовать вспомогательные методы, найденные в EF.Utility.CS.ttinclude, в моих собственных шаблонах T4, и у меня есть средства для добавления моих собственных вспомогательных методов, которые будут доступны для всех проектов.
Ответ 2
Если у вас есть Visual Studio 2012 или 2013, установите этот инструмент EF для устранения ошибки.
Ответ 3
Ответ заключается в том, что процессор шаблонов даже не пытается получить файл include (подтвержденный с помощью ProcMon). Вы можете воспроизвести это с помощью любого шаблона, а не только EF.Utility.CS.ttinlcude
Не уверен, зачем нужен код, но вы всегда можете создать свой собственный базовый класс, просто наследуйте его от Microsoft.VisualStudio.TextTemplating.TextTransformation, а затем введите весь код, который находится в файле EF.Utility. Затем установите директиву inherits, чтобы указать на ваш новый базовый класс, а затем вы можете получить доступ к этим методам из вашего шаблона.