Генератор кода T4 для Entity Framework — не удалось разрешить включение текста для EF.Utility.CS.ttinclude

Я пытаюсь автоматизировать процесс сборки CI-сервера приложения Silverlight 5 с помощью служб OpenRIA.

У меня есть сгенерированный файл Entity Framework .edmx для базы данных, из которого генерируется DomainModel, и как часть сборки я хочу генерировать сущности с помощью генератора кода T4.

Настройки проекта

Мой сервер .csproj меняется.

Импорт

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
# Microsoft.TextTemplating.targets are added after CSharp.targets
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\TextTemplating\Microsoft.TextTemplating.targets"/>

и свойства

<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    ...
<PropertyGroup>

Установлен SDK и инструменты:

Сломанная сборка

Выглядит правильно, но при сборке такая ошибка

5>  Transforming template DomainModel\EntityConverters.tt...
5>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error : Failed to resolve include text for file:C:\{path to my project}\DomainModel\EF.Utility.CS.ttinclude. Line=-1, Column=-1
5>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error : Loading the include file 'EF.Utility.CS.ttinclude' returned a null or empty string. The transformation will not be run. . Line=21, Column=4

Подозрительный

Все файлы .tt имеют импорт T4

<#@ include file="EF.Utility.CS.ttinclude"#> 

У меня есть подозрение, что он нацелен на локальный каталог, а не на каталог сборки.

Мне любопытно, почему переменная Microsoft.TextTemplating.targets нацелена на EF.Utility.CS.ttinclude в {path to my project}, а не в C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes, где она есть на самом деле. Loading the include file 'EF.Utility.CS.ttinclude' returned a null or empty string кажется законным в соответствии с этим путем.

Может быть, я пропустил какую-то настройку, импорт или набор путей? Как я могу изменить или обновить путь для этой утилиты?


Связанные вопросы и ответы уже проверены:


person michalczukm    schedule 30.06.2015    source источник
comment
Вы пробовали это stackoverflow.com/a/8210150/615522 или устанавливали Microsoft Web Developer Tools и Microsoft SQL Server Data Tools?   -  person rotman    schedule 28.08.2015
comment
Установка Microsoft Web Developer Tools и Microsoft SQL Server Data Tools не помогла. Насчет этого вопроса - это не так. Событие, описанное в вопросе обходного пути, не работало во всех случаях.   -  person michalczukm    schedule 29.08.2015
comment
Возможно, можно указать полный путь в ‹#@ include file=... #›   -  person rotman    schedule 30.08.2015


Ответы (2)


Проблема может быть решена путем добавления абсолютного или относительного пути к EF.Utility.CS.ttinclude в вашем файле T4. Для сервера сборки лучшим решением, вероятно, является копирование файлов, которые обычно можно найти по пути C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes, в ваш проект, а затем изменение строки:

<#@ include file="EF.Utility.CS.ttinclude"#>

например:

<#@ include file="..\..\EF.Utility.CS.ttinclude"#>

По какой-то причине, когда преобразование шаблона запускается из MSBuild, оно ищет файлы .ttinclude в том же месте, что и файл .tt.

person rotman    schedule 27.11.2015
comment
Но... ПОЧЕМУ? Почему при установке VS по умолчанию возникают проблемы с файлами, созданными ею самой?... - person Mad Scientist; 19.04.2018
comment
Я не уверен, что эти файлы были сгенерированы VS, но, насколько я помню, проблема возникла только в MSBuild, в VS она работала. - person rotman; 07.05.2018

Я обнаружил, что смог сохранить включаемый файл как

<#@ include file="EF.Utility.CS.ttinclude"#>

добавив следующее в мою конфигурацию

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
  <connectionStrings>
person workabyte    schedule 18.09.2017
comment
Я больше не участвую в проекте и этих проблемах, поэтому мне трудно проверить - можете ли вы подтвердить, создает ли он сущности при запуске вручную из MS Build? - person michalczukm; 20.11.2017