Подтвердить что ты не робот

Ошибка шаблонов 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 без определенного инструмента?

4b9b3361

Ответ 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, чтобы указать на ваш новый базовый класс, а затем вы можете получить доступ к этим методам из вашего шаблона.