2010-12-28 29 views
11

¿Alguien sabe de alguna versión modificada de la plantilla POCO T4 que genera interfaces junto con las clases? es decir, si tengo entidades de Película y Actor en el archivo .edmx, necesito obtener las siguientes clases e interfaces.C# POCO T4 plantilla, generar interfaces?

interface IMovie 
{ 
    string MovieName { get; set; } 
    ICollection<IActor> Actors { get; set; } //instead of ICollection<Actor> 
} 

class Movie : IMovie 
{ 
    string MovieName { get; set; } 
    ICollection<IActor> Actors { get; set; } //instead of ICollection<Actor> 
} 

interface IActor 
{ 
    string ActorName { get; set; } 
} 

class Actor 
{ 
    string ActorName { get; set; } 
} 

Además, en caso de que escribo mis propias entidades, hace proxies POCO (los necesito para carga lenta) trabajar con las declaraciones de interfaz como se muestra arriba?

+0

Jonna, estaría más interesado en saber si tuvo éxito con su enfoque mientras se adapta el código en la respuesta a continuación para la generación de la interfaz POCO +. Estamos estudiando el uso de interfaces de la misma manera y aún no hemos descubierto cómo hacerlo. Un saludo, Timo –

Respuesta

4

Puede editar la plantilla T4 predeterminada que genera sus entidades POCO para generar también interfaces. Lo hice hace un tiempo en un proyecto en el trabajo. This link cubre la cuestión de cómo lo hicimos. Es relativamente fácil.

Aquí hay un fragmento de nuestra plantilla T4, podría ayudar. Insertamos este código en la plantilla T4 predeterminada que genera las entidades POCO.

<# 
    GenerationEnvironment.Clear(); 
    string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);  
    string outputPath = Path.Combine(templateDirectory + @"..\..\Models\Interfaces\Repositories\IEntitiesContext.cs"); 
#> 

using System; 
using System.Data.Objects; 
using Models.DataModels; 

namespace Interfaces.Repositories 
{ 
    #pragma warning disable 1591 
    public interface IEntitiesContext : IDisposable 
    { 
    <# 
     region.Begin("ObjectSet Properties", 2); 

     foreach (EntitySet entitySet in container.BaseEntitySets.OfType<EntitySet>()) 
     { 
#> 
     IObjectSet<<#=code.Escape(entitySet.ElementType)#>> <#=code.Escape(entitySet)#> { get; } 
<# 
     } 
     region.End(); 

     region.Begin("Function Imports", 2); 

     foreach (EdmFunction edmFunction in container.FunctionImports) 
     { 
      var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); 
      string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); 
      if (edmFunction.ReturnParameter == null) 
      { 
       continue; 
      } 
      string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 

#> 
    ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>); 
<# 
     } 

     region.End(); 
#> 

     int SaveChanges(); 
     ObjectContextOptions ContextOptions { get; } 
     System.Data.Common.DbConnection Connection { get; } 
     ObjectSet<T> CreateObjectSet<T>() where T : class; 
    } 
    #pragma warning restore 1591 
} 
<# 
     System.IO.File.WriteAllText(outputPath, GenerationEnvironment.ToString()); 
     GenerationEnvironment.Clear(); 
#> 
+2

Este T4 generará una interfaz para el contexto, pero no parece generar interfaces para las entidades reales (IMovie, IActor, etc.), ¿verdad? –

+0

puede descargar un ejemplo de trabajo de los archivos T4 personalizados para generar interfaces junto con las clases: https://entityinterfacegenerator.codeplex.com/ – Believe2014

0

¿Alguien sabe de cualquier versión modificada de la plantilla POCO T4 que genera las interfaces junto con las clases?

Microsoft no ofrece soporte técnico para generar interfaces.

Hay un recorrido que muestra cómo forzar a Entity Framework a implementar una interfaz. http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx

Como alternativa, puede descargar un ejemplo de trabajo de los archivos T4 personalizados para generar las interfaces junto con las clases:

https://entityinterfacegenerator.codeplex.com/

Cuestiones relacionadas