我们都知道T4模板用于生成相似代码。

在DBFirst和ModelFirst条件下我们很容易从.edmx下获取所有实体类和其名称,并且通过我们定义的模板和某些遍历工作为我们生成所需要的相似代码。

但是CodeFirst模式下,我们没有edmx,从哪获取所有类名呢?难道要我们一个个把Entity实体层类名写进数组里吗,十个百个千个?

解决过程:

1.使用反射获取所有类名,并将此段代码写到T4模板中。

                foreach (Type t in Assembly.Load("Entity").GetTypes())
{
//你对这些类信息的操作
//e.g:
if (t.FullName == "Entity.baseEntity")
{ }
else
{
string fullName = t.FullName;
int length = fullName.Length;
int index = fullName.LastIndexOf('.');
string classname = fullName.Substring(index + 1, length - index - 1);
nameStr += (classname) + ","; } }

2.结果如上代码可以加载程序集并且获取所有类名,可以自行断点查看。当我们把这段代码放到T4模板中,报错信息却是不能加载程序集。(看见了运行时文本模板,还没尝试那个模板是否有效)

3.最后实在没办法了,我在应用中创建了一个名为HelpTool的控制台程序。讲上段代码在Main中改写如下:

      static void Main(string[] args)
{
using (StreamWriter writer = new StreamWriter("D:\\EntitiesNames.txt"))
{
string classNameStr = "";
foreach (Type t in Assembly.Load("Entity").GetTypes())
{
if (t.FullName == "Entity.BaseEntity" || t.FullName == "Entity.DbContextFactory" || t.FullName == "Entity.WeDbContext")
{ }
else
{
string fullName = t.FullName;
int length = fullName.Length;
int index = fullName.LastIndexOf('.');
string classname = fullName.Substring(index + 1, length - index - 1);
classNameStr += (classname) + ",";
}
}
writer.Write("");
writer.Write(classNameStr);
//Console.WriteLine("WriteClassNameSuccessfully");
//Console.ReadKey();
}
}

4.很明确,我将它写到文本文件里,每次修改实体类,我都要运行一下我的控制台应用。

5.在T4模板中读取文本文件。例如:

得到所有实体类的名,存到数组中,并遍历生成相似代码。

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#> <#
string[] className=new string[]{""};
using (StreamReader reader = new StreamReader("D:\\EntitiesNames.txt"))
{
string nameStr = reader.ReadToEnd();
int index=nameStr.LastIndexOf(',');
nameStr=nameStr.Substring(0,index);
className= nameStr.Split(',');
} #> using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DalFactory;
using Entity;
using s2s.IDAL; namespace s2s.UnitOfWork
{
public partial class UnitWork
{
<#
foreach (var entity in className)
{
#> public I<#=entity#>Dal <#=entity#>Dal
{
get { return AbstractDalFactory.GetInstance("<#=entity#>Dal") as I<#=entity#>Dal; }
} <#}#>
}
}

我知道这个方法很笨,谈不上好方案,在遇到问题,coder们总能提出各种各样的解决方案。

希望园子里的朋友们推荐好的方案,多多指教。

CodeFirst时使用T4模板的更多相关文章

  1. CodeFirst时使用T4模板(你肯定没用过的笨方法,还望园友指教)

    我们都知道T4模板用于生成相似代码. 在DBFirst和ModelFirst条件下我们很容易从.edmx下获取所有实体类和其名称,并且通过我们定义的模板和某些遍历工作为我们生成所需要的相似代码. 但是 ...

  2. EF CodeFirst 使用T4模板 生成文件

    小编是个实用主义者,并没有深入的去理解T4的原理.只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板. 最近的项目用了他,很方便,节省了不少代码量. 想利用T4做 ...

  3. EF CodeFirst 使用T4模板

    实用等级:★★★★★ 首先,定义一个接口,代表一个领域实体.在定义一个实体集成这个接口,面向接口编程的各种好处就不提了. /// <summary> /// 代表一个领域实体 /// &l ...

  4. T4模板之菜菜鸟篇

    一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...

  5. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

  6. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

    原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...

  7. 从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)

    最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来. 直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用 1.首 ...

  8. 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)

    对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率.所以学好T4模板的应用,对于开发人员来说是非常重要的. 园子里对于T4模板的介绍与资料已经太 ...

  9. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

随机推荐

  1. ASP.NET学习笔记(1)——VS自动引入命名空间快捷键

    说明(2017-7-3 22:16:35) 1.在vs的“工具”->“选项”中,左侧树形菜单,“环境”下的“键盘”中设置快捷键. 在“显示命令包含”输入框内输入“显示智能标记”,找到“视图.显示 ...

  2. Android 沉浸式顶部

    研究了下这个,记录下代码. 主页面代码:activity_main.xml <?xml version="1.0" encoding="utf-8"?&g ...

  3. Tomcat配置JMX远程监控(Windown7 Linxu)

    一:Window7下配置方式. 1.配置catalina.bat 在第一行加入下面配置 注意下面这些配置要在一行,注意包含空格. set JAVA_OPTS=-Dcom.sun.management. ...

  4. if语句和switch语句

    1.基本写法 if if(逻辑表达式){语句:}else if{语句:else{语句:} switch switch(变量){case 常量值:语句:break:default:语句:} 2.举例 i ...

  5. HashSet与TreeSet 区别

    HashSetHashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSe ...

  6. 前端最全的 API 集锦

    window.getComputedStyle(el,':after')[attrName]------------------------------------------------------ ...

  7. R语言合并data.frame

    Merging Data Adding Columns To merge two data frames (datasets) horizontally,  use the merge functio ...

  8. OpenGL中的二维编程——从简单的矩形开始

    一.OpenGL的组成 图元函数(primitive function)指定要生成屏幕图像的图元.包括两种类型:可以在二维.三维或者四维空间进行定义的几何图元,如多边形:离散实体:位图. 属性函数(a ...

  9. Spring JDBC StoredProcedure类示例

    org.springframework.jdbc.core.StoredProcedure类是RDBMS存储过程的对象抽象的超类.这个类是抽象的,目的是让子类将提供一个用于调用的类型化方法,该方法委托 ...

  10. Newtonsoft.Json 序列化小写首字母

    //json对象命名小驼峰式转换var json = JsonConvert.SerializeObject(newAccount, Formatting.Indented, new JsonSeri ...