EF CodeFirst 使用T4模板

实用等级:★★★★★

首先,定义一个接口,代表一个领域实体。在定义一个实体集成这个接口,面向接口编程的各种好处就不提了。

/// <summary>
/// 代表一个领域实体
/// </summary>
public interface IEntity
{
    Guid ID { get; }
}
public abstract class Entity : IEntity
{
    public Guid ID { get; set; }
    //这里可以写一些领域实体的基本方法。面向对象么 有时总会有写对象自己的公用的方法.类似 freamework的 Object
}
public class User : Entity
{
}

之后新建一个T4模板文件。先上代码后面解释下关键的地方

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)ModelinDebugModel.dll" #>
<#@ import namespace="Model" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO"#>
<#@ import namespace="System"#>
<#@ import namespace="System.Configuration"#>  
<#@ output extension=".cs" #>
<#@include file="$(SolutionDir)packagesMultipleOutputHelper.ttinclude"#>
 
<#
    var assembly = System.Reflection.Assembly.GetAssembly(typeof(IEntity));
    var types = assembly.GetTypes().Where(x => typeof(IEntity).IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface);
    var manager = Manager.Create(Host, GenerationEnvironment); 
    foreach (var type in types)
    {
        // 定义输出文件
        manager.StartNewFile(type.Name+"TypeConfiguration.cs");
#>
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
using Model;
 
namespace Data
{
    public class <#=type.Name#>TypeConfiguration : EntityTypeConfiguration<<#=type.Name#>>
    {
        public <#=type.Name#>TypeConfiguration()
        {
            HasKey(c => c.ID);
            Property(c => c.ID)
                .IsRequired()
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
          
            ToTable("<#=type.Name#>");
        }
    }
}
<#
        // 结束输出文件
        manager.EndBlock();
    }
    // 执行编译
    manager.Process(true); 
#>
//代码解释:

<#@ assembly name="$(SolutionDir)ModelinDebugModel.dll" #>//为了获取领域实体所在的dll文件。之后通过反射dll获取集成实体接口。

$(SolutionDir)  //VS的宏命令,获取当前的解决方案路径。

<#@ import namespace="Model" #>   //引用dll。类似using

<#@include file="$(SolutionDir)packagesMultipleOutputHelper.ttinclude"#>//这个文件很关键,是个老外写的,它会帮助生成cs文件。该文件在附件中packages里面。

 示例源码:T4Demo.rar

原文地址:https://www.cnblogs.com/zhaoshujie/p/12052856.html