Reputation: 1645
Does anyone know of any tweaked version of POCO T4 template that generates interfaces along with classes? i.e. if I have Movie and Actor entities in .edmx file, I need to get the following classes and 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; }
}
Also, just in case I write my own entities, does POCO proxies(I need them for lazy loading) work with the interface declarations as shown above?
Upvotes: 12
Views: 5019
Reputation: 3964
Does anyone know of any tweaked version of POCO T4 template that generates interfaces along with classes?
There is no official support from Microsoft about generating interfaces.
There's a walk through that shows how to force Entity framework to implement an interface. http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx
Alternatively, you can download a working example of the customized T4 files to generate interfaces along with classes:
https://entityinterfacegenerator.codeplex.com/
Upvotes: 0
Reputation: 13931
You can edit the default T4 template that generates your POCO entities to also generate interfaces. I did this a while back on a project at work. This link covers the jist of how we did it. It's relatively easy.
Here's a snippet of our T4 template, might help. We inserted this code into the default T4 template that generates the POCO entities.
<#
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();
#>
Upvotes: 5