• 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

  • 相关阅读:
    以流的形式将文件写入页面,直接下载
    多线程异步处理示例
    windows端口占用查看
    Spring MVC中默认的ResponseBody为String的乱码问
    inode安装
    uploadfy使用
    动态时间工具类
    常量设置
    项目配置热部署
    springboot异常:yml文件无法识别
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/12052856.html
Copyright © 2020-2023  润新知