C#POCO T4模板,生成接口?

时间:2010-12-28 22:49:43

标签: c# entity-framework poco

有没有人知道POCO T4模板的任何调整版本,它会产生接口和类? 即如果我在.edmx文件中有Movie和Actor实体,我需要获得以下类和接口。

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; }
}

另外,为了防止我编写自己的实体,POCO代理(我需要它们用于延迟加载)是否可以使用如上所示的接口声明?

2 个答案:

答案 0 :(得分:5)

您可以编辑生成POCO实体的默认T4模板,以生成接口。我在工作项目上做了一段时间。 This link涵盖了我们如何做到这一点的主旨。这很容易。

这是我们的T4模板的片段,可能会有帮助。我们将此代码插入到生成POCO实体的默认T4模板中。

<#
    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();
#>

答案 1 :(得分:0)

  

有没有人知道POCO T4模板的任何调整版本,它会产生接口和类?

Microsoft没有关于生成接口的官方支持。

演示了如何强制实体框架实现接口。 http://blogs.msdn.com/b/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx

或者,您可以下载自定义T4文件的工作示例以生成接口以及类:

https://entityinterfacegenerator.codeplex.com/