zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux关闭防火墙和selinux
    Linux内存VSS,RSS,PSS,USS解析
    JS 将有父子关系的数组转换成树形结构数据
    npm install报错类似于npm WARN tar ENOENT: no such file or directory, open '*** ode_modules.staging***
    react-native之文件上传下载
    Markdown语法简记
    MySQL运维开发
    股票投资
    数据仓库原理与实战
    python基础
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/12052856.html
Copyright © 2011-2022 走看看