• EF CodeFirst 使用T4模板 生成文件


    小编是个实用主义者,并没有深入的去理解T4的原理。只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板。

    最近的项目用了他,很方便,节省了不少代码量。

    想利用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

  • 相关阅读:
    使用C#调用C++类库
    C# IntPtr类型
    C# 调用C++ dll string类型返回
    C# try、catch、finally语句
    C语言 char *、char []、const char *、string的区别与相互转换
    C# 字符串string与char数组互转!
    C#如何调用C++(进阶篇)
    Springboot通过过滤器实现对请求头的修改
    【spring事务】
    命令行参数库:McMaster.Extensions.CommandLineUtils【转】
  • 原文地址:https://www.cnblogs.com/since87/p/3963654.html
Copyright © 2020-2023  润新知