Ошибка шаблонов T4: при загрузке файла включения ef.utility.cs.ttinclude вернуло пустую или пустую строку - PullRequest
14 голосов
/ 10 ноября 2011

Я переопределил шаблоны генерации контроллера T4 (ControllerWithContext.tt), как описано здесь .
Я хотел бы воспользоваться преимуществами вспомогательных утилит кода из EF.utility.CS.ttinclude, которые используются в шаблоне генератора моделей POCO T4. Поэтому я скопировал следующие строки из моего 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 в мой ControllerWithContext.tt, который сам по себе выдает больше ошибок, но который легко решается.

Как включить шаблоны T4 без определенного пользовательского инструмента?

Ответы [ 3 ]

10 голосов
/ 21 ноября 2011

Следуя совету @DustinDavis и используя бесценную информацию, найденную на сайте Олега Сыча , вот что я сделал:

  • Создал новый проект под названием 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" #>

Все это теперь означает, что я могу использовать вспомогательные методы, найденные в EF.Utility.CS.ttinclude в моем собственномШаблоны T4, и у меня есть возможность добавить свои собственные вспомогательные методы, которые будут доступны для всех проектов.

4 голосов
/ 17 декабря 2014

Если у вас установлена ​​Visual Studio 2012 или 2013, установите этот инструмент EF для устранения ошибки.

2 голосов
/ 16 ноября 2011

Ответ заключается в том, что процессор шаблонов даже не пытается получить включаемый файл (как подтверждено с помощью ProcMon).Вы можете воспроизвести это, используя любой шаблон, а не только EF.Utility.CS.ttinlcude

Не уверен, зачем вам нужен код, но вы всегда можете создать свой собственный базовый класс, просто наследуйте его от Microsoft.VisualStudio.TextTemplating.TextTransformation, а затем вставьте весь код, который находится в файле EF.Utility.Затем установите директиву наследования, чтобы он указывал на ваш новый базовый класс, и затем вы сможете получить доступ к этим методам из вашего шаблона.

...