2011-11-10 22 views
14

He anulado las plantillas T4 de generación de controladores (ControllerWithContext.tt) como se describe here.
Me gustaría aprovechar las utilidades de código auxiliar que se encuentran en EF.utility.CS.ttinclude como las usadas en la plantilla del generador de modelos POCO T4. Por lo tanto, copié las siguientes líneas de mi Model.tt a mi ControllerWithContext.tt.Error de plantillas T4: cargando el archivo de inclusión ef.utility.cs.ttinclude devolvió una cadena vacía o nula

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

Sin embargo, cuando intento agregar un controlador que estoy recibiendo el mensaje de error

Loading the include file 'EF.utility.CS.ttinclude' returned a null or empty string

De acuerdo con la MSDN documentation, este error es debido a que el archivo incluido está en blanco, lo que está claro que no es porque trabaja con Model.tt

la única diferencia que puedo ver es que el anulado ControllerWithContext.tt no tiene una herramienta personalizada definida, mientras que el Model.tt lo tiene establecido en TextTemplatingFileGenerator.

Mi solución consiste en copiar las funciones que necesito de ef.utility.cs.ttinclude en mi ControllerWithContext.tt, que en sí mismo arrojó más errores pero que se resolvieron fácilmente.

¿Cómo puedo incluir plantillas T4 sin una herramienta personalizada definida?

Respuesta

2

La respuesta es que el procesador de plantillas ni siquiera está tratando de obtener el archivo de inclusión (como se confirmó con ProcMon). Puede reproducir esto utilizando cualquier plantilla, no solo EF.Utility.CS.ttinlcude

No estoy seguro de por qué necesita el código, pero siempre puede crear su propia clase base, solo heredarlo de Microsoft.VisualStudio.TextTemplating. TextTransformation y luego ingrese todo el código que está en el archivo EF.Utility. Luego configure la directiva hereda para que apunte a su nueva clase base y luego puede acceder a esos métodos desde su plantilla.

+0

Gracias. Como mencioné, quería aprovechar la clase 'CodeGenerationTools' que se encuentra en' ef.utility.cs.ttinclude' en mis propias plantillas T4. – Webbie4

+0

Simplemente sigue lo que sugerí y puedes, simplemente no usando una inclusión (al menos por ahora porque parece estar roto) –

+0

@DustinDavis: ¿estás diciendo que '<# @ include file =" ... "#> 'simplemente no funciona? –

10

Siguiendo el consejo @DustinDavis', y el uso de la información muy valiosa que se encuentra en OlegSych's site, esto es lo que hice:

  • Creado un nuevo proyecto llamado CodeGenerationTools.
  • Agregado proyecto hace referencia a

    • System.Data.Entity.Design
    • EnvDTE
    • System.Data.Entity
    • Microsoft.VisualStudio.TextTemplating.10.0

    Para esta última referencia tuve que instalar la versión correcta de Visual Studio SDK

  • Copió el archivo EF.Utility.CS.ttinclude en el proyecto.
  • Se le cambió el nombre por CodeGenerationTools.cs
  • Editado el archivo y convertir todos <#@ import namespace="<name>" #> a using <name>;
  • Se eliminó la apertura y cierre de <#+ #>
  • añadido la directiva using Microsoft.VisualStudio.TextTemplating;
  • extendido la clase:

    public class CodeGenerationTools : TextTransformation 
    
  • Sustituir el TransformText método

    public override string TransformText() { 
        throw new NotImplementedException(); 
    } 
    
  • Añadido constructor vacío

    public CodeGenerationTools() { 
        _textTransformation = DynamicTextTransformation.Create(this); 
        _code = new CSharpCodeProvider(); 
        _ef = new MetadataTools(_textTransformation); 
        FullyQualifySystemTypes = false; 
        CamelCaseFields = true; 
    } 
    
  • Por último, construir este proyecto.

Los siguientes pasos tuvieron lugar en el proyecto principal - Editado el archivo de plantilla T4. - El cambio de directiva de plantilla para

<#@ template language="C#" HostSpecific="True" debug="false" inherits="CodeGenerationTools"#> 

- Se ha añadido las directivas

<#@ assembly name="C:\Visual Studio 2010\Projects\CodeGenerationTools\CodeGenerationTools\bin\Debug\CodeGenerationTools.dll" #> 
    <#@ import namespace="CodeGenerationTools" #> 

Todo lo cual significa ahora que puedo utilizar los métodos de ayuda que se encuentran en EF.Utility.CS.ttinclude en mis propias plantillas T4, y tengo los medios para agregar mis propios métodos de ayuda que estarán disponibles para todos los proyectos.

4

Si tiene Visual Studio 2012 o 2013, instale this EF tool para resolver el error.

+0

Tu respuesta me salvó. realmente gracias por la ayuda. Tienes que ser la respuesta # 1 –

+0

sigue siendo un problema para mí – RezaRahmati

Cuestiones relacionadas