CodeFirst时使用T4模板
我们都知道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模板的更多相关文章
- CodeFirst时使用T4模板(你肯定没用过的笨方法,还望园友指教)
我们都知道T4模板用于生成相似代码. 在DBFirst和ModelFirst条件下我们很容易从.edmx下获取所有实体类和其名称,并且通过我们定义的模板和某些遍历工作为我们生成所需要的相似代码. 但是 ...
- EF CodeFirst 使用T4模板 生成文件
小编是个实用主义者,并没有深入的去理解T4的原理.只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板. 最近的项目用了他,很方便,节省了不少代码量. 想利用T4做 ...
- EF CodeFirst 使用T4模板
实用等级:★★★★★ 首先,定义一个接口,代表一个领域实体.在定义一个实体集成这个接口,面向接口编程的各种好处就不提了. /// <summary> /// 代表一个领域实体 /// &l ...
- T4模板之菜菜鸟篇
一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
- 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...
- 从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)
最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来. 直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用 1.首 ...
- 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)
对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率.所以学好T4模板的应用,对于开发人员来说是非常重要的. 园子里对于T4模板的介绍与资料已经太 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
随机推荐
- new、delete、以及queue类
本来以为很容易的,结果还是写了我两个小时. 用指针模拟queue类,再加上类,各种错误,总算是解决掉了-- #include<iostream> #include<cstdlib&g ...
- EXCEL行倒叙
- django 目录结构修改
├── manage.py └── myxunlei ├── settings.py ├── settings.pyc ├── urls.py ├── urls.pyc ├── wsgi.py └── ...
- C#学习笔记(21)——C#获取文件夹下的所有文件的文件名
说明(2017-7-30 23:11:59): 1. 文件处理老是忘,学的不扎实. 2. 路径用Directory,文件名用file. 3. 我也推荐用第二种方法,可以拿到文件的所有信息,比如扩展名什 ...
- Cpu表现出正弦曲线
#include <windows.h> #include <math.h> int main(void) { SetThreadAffinityMask(GetCurrent ...
- tongjiword,write / read file demo
1.tong ji letter demo mport sys def tongjiword(): fi =open(paht,'r') cont=fi.read() wl={} for line i ...
- 输//ip提示找不到应用程序
输//ip提示找不到应用程序??? (未测试)试试:环境变量的 PATH 中添加 C:\Windows\system32 (未测试)试试:默认程序里----协议关联里:管理ie
- Flexbox的布局
http://segmentfault.com/blog/gitcafe/1190000002490633 https://css-tricks.com/snippets/css/a-guide-to ...
- mysql archive存储引擎导入数据报duplicate key
DROP TABLE IF EXISTS `test`;CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `ve ...
- jQuery(四):HTML代码操作
html()可以对HTML代码进行操作,类似于元素JavaScript中的innerHTML. 例如: 示例: <!DOCTYPE html> <html lang="en ...