在用NCodeGenerate做代码生成的过程中,免不了经常会从数据库类型到C#类型之间的来回映射,如果这样的映射都要用代码来写的话就太繁琐了,NCodeGenerate和CodeSmith类似,以提供的通过XML文件来定义类型映射的功能,称之为Map映射功能.
现在举个例子说明一下:
首先在NCodeGenerate 中新建Map 文件
<?xml version="1.0" encoding="utf-8"?>
<NCodeGenerate xmlns="http://www.NCodeGenerate.com/schema/CGmap.xsd">
<map caseSensitive="true" returnKeyWhenNotFound="false" description="DbType to CSharp">
<item>
<key>AnsiString</key>
<value>string</value>
</item>
<item>
<key>AnsiStringFixedLength</key>
<value>string</value>
</item>
<item>
<key>Binary</key>
<value>byte[]</value>
</item>
<item>
<key>Boolean</key>
<value>bool</value>
</item>
<item>
<key>Byte</key>
<value>byte</value>
</item>
<item>
<key>Currency</key>
<value>decimal</value>
</item>
<item>
<key>Date</key>
<value>DateTime</value>
</item>
<item>
<key>DateTime</key>
<value>DateTime</value>
</item>
<item>
<key>Decimal</key>
<value>decimal</value>
</item>
<item>
<key>Double</key>
<value>double</value>
</item>
<item>
<key>Guid</key>
<value>Guid</value>
</item>
<item>
<key>Int16</key>
<value>short</value>
</item>
<item>
<key>Int32</key>
<value>int</value>
</item>
<item>
<key>Int64</key>
<value>long</value>
</item>
<item>
<key>Object</key>
<value>object</value>
</item>
<item>
<key>SByte</key>
<value>sbyte</value>
</item>
<item>
<key>Single</key>
<value>float</value>
</item>
<item>
<key>String</key>
<value>string</value>
</item>
<item>
<key>StringFixedLength</key>
<value>string</value>
</item>
<item>
<key>Time</key>
<value>TimeSpan</value>
</item>
<item>
<key>UInt16</key>
<value>ushort</value>
</item>
<item>
<key>UInt32</key>
<value>uint</value>
</item>
<item>
<key>UInt64</key>
<value>ulong</value>
</item>
<item>
<key>VarNumeric</key>
<value>decimal</value>
</item>
<item>
<key>DateTime2</key>
<value>DateTime</value>
</item>
<item>
<key>DateTimeOffset</key>
<value>DateTimeOffset</value>
</item>
</map>
</NCodeGenerate>
这个文件的结构非常简单,主要就是定义了 DBType类型到 CSharp 类型的K/V字典. 把文件保存到程序根目录下面的 Maps 子目录 DbType2CSharp.cgmap。
注意:目前系统只从 Maps目录取映射文件。
新建模板文件输入代码:
@model DynamicCodeGenerate.myModel
@using NCodeGenerateIDE;
@{
CGMap map=CGMap.LoadMap("DbType2CSharp");
}
@{
8 foreach(var item in Model.DataBase.Tables){
@:TableName:@item.Name
foreach(var itemcolumn in item.Columns)
{
@:Column:@itemcolumn.Name
@:ColumnDataType:@itemcolumn.DataType.ToString() CSharpType:@map[itemcolumn.DataType.ToString()]
}
}
}
看上面的代码 第4行 定义了一个CGMap的对象,注意LoadMap方法的参数,不需要输入路径名和文件后缀名。
在看代码中的 第13行 @map[itemcolumn.DataType.ToString()] 这句代码就是根据数据库列的DBType类型取 CSharp的类型名字。就像用普通的Dictionary<string,string> 类型一样使用。
目前系统提供了:
DbType2CSharp
DbType2DataReaderMethod
Oracle2CSharp
Sql2CSharp
Sql2System
SqlNativeType2DbType
SqlNativeType2SqlDbType
System2CSharpAlias
8种映射,如果不够的话,大家可以自己定义新的映射表。
附: NCodeGenerate 新增了 NCodeGenerate.DBSchema 的文档,在下面的文档连接中。
附上下载地址:
文档:文档
NCodeGenerate 系列文章:
一、代码生成利器-NCodeGenerate 是什么?
二、代码生成利器-NCodeGenerate 教程(1) 遍历数据库内的所有表
三、代码生成利器-NCodeGenerate 教程(2) NCodeGenerate的代码公用之一
四、代码生成利器-NCodeGenerate 教程(3) 生成代码到文件.
五、 代码生成利器-NCodeGenerate 教程(4) CodeSmith模板转换
六、代码生成利器-NCodeGenerate 教程(5) 多种数据库的支持