代码生成利器-NCodeGenerate 教程(9) 数据类型映射Map功能
在用NCodeGenerate做代码生成的过程中,免不了经常会从数据库类型到C#类型之间的来回映射,如果这样的映射都要用代码来写的话就太繁琐了,NCodeGenerate和CodeSmith类似,以提供的通过XML文件来定义类型映射的功能,称之为Map映射功能.
现在举个例子说明一下:
首先在NCodeGenerate 中新建Map 文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <NCodeGenerate xmlns="http://www.NCodeGenerate.com/schema/CGmap.xsd"> 3 <map caseSensitive="true" returnKeyWhenNotFound="false" description="DbType to CSharp"> 4 <item> 5 <key>AnsiString</key> 6 <value>string</value> 7 </item> 8 <item> 9 <key>AnsiStringFixedLength</key> 10 <value>string</value> 11 </item> 12 <item> 13 <key>Binary</key> 14 <value>byte[]</value> 15 </item> 16 <item> 17 <key>Boolean</key> 18 <value>bool</value> 19 </item> 20 <item> 21 <key>Byte</key> 22 <value>byte</value> 23 </item> 24 <item> 25 <key>Currency</key> 26 <value>decimal</value> 27 </item> 28 <item> 29 <key>Date</key> 30 <value>DateTime</value> 31 </item> 32 <item> 33 <key>DateTime</key> 34 <value>DateTime</value> 35 </item> 36 <item> 37 <key>Decimal</key> 38 <value>decimal</value> 39 </item> 40 <item> 41 <key>Double</key> 42 <value>double</value> 43 </item> 44 <item> 45 <key>Guid</key> 46 <value>Guid</value> 47 </item> 48 <item> 49 <key>Int16</key> 50 <value>short</value> 51 </item> 52 <item> 53 <key>Int32</key> 54 <value>int</value> 55 </item> 56 <item> 57 <key>Int64</key> 58 <value>long</value> 59 </item> 60 <item> 61 <key>Object</key> 62 <value>object</value> 63 </item> 64 <item> 65 <key>SByte</key> 66 <value>sbyte</value> 67 </item> 68 <item> 69 <key>Single</key> 70 <value>float</value> 71 </item> 72 <item> 73 <key>String</key> 74 <value>string</value> 75 </item> 76 <item> 77 <key>StringFixedLength</key> 78 <value>string</value> 79 </item> 80 <item> 81 <key>Time</key> 82 <value>TimeSpan</value> 83 </item> 84 <item> 85 <key>UInt16</key> 86 <value>ushort</value> 87 </item> 88 <item> 89 <key>UInt32</key> 90 <value>uint</value> 91 </item> 92 <item> 93 <key>UInt64</key> 94 <value>ulong</value> 95 </item> 96 <item> 97 <key>VarNumeric</key> 98 <value>decimal</value> 99 </item> 100 <item> 101 <key>DateTime2</key> 102 <value>DateTime</value> 103 </item> 104 <item> 105 <key>DateTimeOffset</key> 106 <value>DateTimeOffset</value> 107 </item> 108 </map> 109 </NCodeGenerate>
这个文件的结构非常简单,主要就是定义了 DBType类型到 CSharp 类型的K/V字典. 把文件保存到程序根目录下面的 Maps 子目录 DbType2CSharp.cgmap。
注意:目前系统只从 Maps目录取映射文件。
新建模板文件输入代码:
1 @model DynamicCodeGenerate.myModel 2 @using NCodeGenerateIDE; 3 @{ 4 CGMap map=CGMap.LoadMap("DbType2CSharp"); 5 } 6 @{ 7 8 foreach(var item in Model.DataBase.Tables){ 9 @:TableName:@item.Name 10 foreach(var itemcolumn in item.Columns) 11 { 12 @:Column:@itemcolumn.Name 13 @:ColumnDataType:@itemcolumn.DataType.ToString() CSharpType:@map[itemcolumn.DataType.ToString()] 14 } 15 16 17 } 18 19 }
看上面的代码 第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) 多种数据库的支持
七、代码生成利器-NCodeGenerate 教程(6) 调试功能 NTrace 输出
八、代码生成利器-NCodeGenerate 教程(7) 揭开调试功能 的神秘面纱
九、代码生成利器-NCodeGenerate 教程(8) 揭开Razor模板引擎的神秘面纱
十、代码生成利器-NCodeGenerate 教程(9) 数据类型映射Map功能