按照开发层次来说,《用T4模版生成MyBatis映射文件代码》应该在前面介绍,但为了能够给大家简单介绍T4模版的使用,我把复杂的映射文件放在后面,以免大家产生畏难情绪而不使用俯在微软上的东东。
通过前面几篇文章,大家可以看到,我们使用的T4模版以及EF使非常简单的:
1、T4模版,就一对<# 和#>特殊运算符,其余的就是基本的时基础的语法了。
2、EF,我们使用了几个个属性:
A、EF的对象集合EdmItemCollection,从而获得实体集ItemCollection.GetItems
B、EF的文件操作,主要是文件的输出:
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
fileManager.StartNewFile(文件名称);
C、EF中实体的属性的类型,edmProperty.TypeUsage以及转换code.Escape();
D、EF中实体的属性的名称,edmProperty.Name;
有了以上的,我们可以编写一些简单的、富有规律的模版,生成相应的代码。可这些还是不够的,还有一类属性我们没有介绍,导航属性;对,就是对象间的关系,再说来就是数据库的外键关系。关于外键的,我准备单独一篇文章介绍,因为它又是一个体系的东西了。
下面,我们开始《用T4模版生成MyBatis映射文件代码》编写。
第一步、在“解决方案JavaGenerate”中添加类库,用于存放SQLXml的模版及相应文件,我们命名这个类库为JavaSQLXmls。
点击“解决方案JavaGenerate”,右键,选择“添加 ”--〉“新建项目”,再选择"类库",名称中输入JavaSQLXmls。
返回后,在“解决方案JavaGenerate”中增加了一个叫JavaSQLXmls的项目,且自带了一个class.cs的类,我们点击它,
再点右键删除它,不用它。
如图7-1,注意红色方框,特别是要选中.NET Framework4
图7-1
第二步,增加t4空模版
在解决方案管理器中,选择JavaSQLXmls项目,点击右键,选择“添加 ”--〉“新建项”,
在弹出的窗体中做图6-2的选择和输入项
图6-2
第三步,我又贴代码,大家看注释把,没得错,我调试了的
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE"#>
<#@ output extension=".cs"#><#
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, 1);
MetadataTools ef = new MetadataTools(this);
string inputFile = @"..\EDMX\dblxh.edmx";//EDMX项目中dblxh.edmx的路径
MetadataWorkspace metadataWorkspace = null;
bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace);
EdmItemCollection ItemCollection = (EdmItemCollection)metadataWorkspace.GetItemCollection(DataSpace.CSpace);
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
// 发出文件
foreach (EntityType entity in ItemCollection.GetItems().OrderBy(e => e.Name))
{
string filePascialName=getModelsPascialName(entity.Name);//Pascial风格的类名称
string fileCamelName=getModelsCamelName(entity.Name);//Camel风格的类名称
string PrimaryPropertyPascialName="";//主键属性名称,Pascial风格的
string PrimaryPropertyCamelName="";//主键属性名称,Camel风格的
string PrimaryColumName="";//主键字段名称
fileManager.StartNewFile(filePascialName+ "Mapper.xml");//输出的类文件名称,及开始输出文件
foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
if (ef.IsKey(edmProperty))
{
PrimaryPropertyPascialName=getPropertyPascialName(edmProperty.Name);
PrimaryPropertyCamelName=getPropertyCamelName(edmProperty.Name);
PrimaryColumName=edmProperty.Name;
break;
}
}
#>
<#foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
if (edmProperty.Name==PrimaryColumName) continue;
#>
<#}#>
insert into dblxh.<#=entity.Name#>
(
<#=strInsertOneFormEntityProperty(entity)#>
)
values
(
<#= strInsert2(entity) #>
)
SELECT LAST_INSERT_ID() AS id
update dblxh.<#=entity.Name#>
<#foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
if (edmProperty.Name==PrimaryColumName) continue;
if ((edmProperty.Name=="create_time")||(edmProperty.Name=="create_author")) continue;//这两个字段,在修改时不修改;其它的不修改的字段如法炮制
if (edmProperty.Name=="update_time")
{#>
update_time=now(),
<# continue;
}
//if test进行分类判断处理,数值和字符串判断的不同
if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Integer")
{#>
<#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>},
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Long")
{#>
<#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>},
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Double")
{#>
<#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>},
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="String")
{#>
<#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>},
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="byte[]")
{#>
<#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>},
<#}#>
<#}#>
<#=PrimaryColumName#>=#{<#=PrimaryPropertyCamelName#>}
delete from dblxh.<#=entity.Name#>
delete from dblxh.<#=entity.Name#>
where <#=PrimaryColumName#>=#{<#=PrimaryPropertyCamelName#>}
<#foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Integer")
{#>
and <#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>}
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Long")
{#>
and <#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>}
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="Double")
{#>
and <#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>}
<#}#>
<#if (getPropertyType(code.Escape(edmProperty.TypeUsage))=="String")
{#>
and <#=edmProperty.Name#>=#{<#=getPropertyCamelName(edmProperty.Name)#>}
<#}#>
<#}#>
<#
}
fileManager.Process();
#>
<#+
//得到类的Pascial风格名称
string getModelsPascialName(string source)
{
string[] s=source.Split('_');
for(int i=0;i
<#+
//得到类的Camel风格名称
string getModelsCamelName(string source)
{
string[] s=source.Split('_');
for(int i=0;i
<#+
//得到属性的Pascial风格名称
string getPropertyPascialName(string source)
{
string[] s=source.Split('_');
for(int i=0;i") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Nullable") result="Integer";
if (source=="Int64") result="Long";
if (source=="long") result="Long";
if (source=="Long") result="Long";
if (source=="Nullable") result="Long";
if (source=="Nullable") result="Long";
if (source=="Nullable") result="Long";
if (source=="float") result="Double";
if (source=="Float") result="Double";
if (source=="decimal") result="Double";
if (source=="Decimal") result="Double";
if (source=="Nullable") result="Double";
if (source=="Nullable") result="Double";
if (source=="Nullable") result="Double";
if (source=="Nullable") result="Double";
if (source=="byte[]") result="byte[]";
if (source=="string") result="String";
if (source=="String") result="String";
if (source=="System.Date") result="String";
if (source=="System.Time") result="String";
if (source=="System.DateTime") result="String";
if (source=="Nullable") result="String";
if (source=="Nullable") result="String";
if (source=="Nullable") result="String";
return result;
}
#>
<#+
//Insert语句的第一段
string strInsertOneFormEntityProperty(EntityType entity)
{
string result="";
foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
result+=","+edmProperty.Name;
}
return result.Substring(1);
}
#>
<#+
//Insert语句的第二段,特殊字段的默认值的问题,规律
string strInsert2(EntityType entity)
{
string result="";
foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity))
{
//if ((edmProperty.Name=="create_time")||(edmProperty.Name=="update_time"))
string str=edmProperty.Name;
if (str.Contains("_time"))
{
result+=",now()";
}
else
{
result+=",#{"+getPropertyCamelName(edmProperty.Name)+"}";//edmProperty.Name;now()
}
}
return result.Substring(1);
}
#>