用node.js给C#写一个数据表的实体类生成工具

虽然微软提供了T4模板,可是我感受很是难用。哪儿比得上直接用脚原本写模板来的爽。node

由于要给一个老项目作周边的工具,须要链接到数据库。sql

我习惯性用EntityFrameworkCore来作,由于毕竟从出道开始就一直在用的一个ORM。数据库

EF6时代,vs提供了dbfirst,可是只是针对sqlserver好像。npm

由于此次的数据库是MySQL,因此vs不少东西都支持不够了。工具

可是支持不够就本身动手丰衣足食嘛。sqlserver


 

咱们使用ejs这个模板引擎来作生成器。post

npm install ejs

而后用查询出表结构:spa

b.query('desc posts').then(res => {

})

而后编写模板,ejs的模板语法和aspx时代的时候的模板语法很类似,都是尖括号+百分号这样的风格<%%>,相信有aspx开发经验的老铁们对这个模板引擎仍是很习惯的code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace 你的命名空间
{
public class <%= table -%>
{
<% rows.forEach(function(row){ -%>
<% if(row.Type.indexOf('bigint')!=-1){ -%>
public long <%= row.Field %> { get; set; }
<% } -%>
<% if(row.Type.indexOf('datetime')!=-1){ -%>
public DateTime <%= row.Field %> { get; set; }
<% } -%>
<% if(row.Type.indexOf('varchar')!=-1){ -%>
public string <%= row.Field %> { get; set; }
<% } -%>
<% if(row.Type.indexOf('mediumtext')!=-1){ -%>
public string <%= row.Field %> { get; set; }
<% } -%>
<% if(row.Type.indexOf('bit')!=-1){ -%>
public bool <%= row.Field %> { get; set; }
<% } -%>
<% if(row.Type.indexOf('longtext')!=-1){ -%>
public string <%= row.Field %> { get; set; }
<% } -%>
<% }); -%>
}
}

以上的模板中,针对不一样的MySQL数据类型作了对应的C#类型映射。server

而后使用ejs来渲染出一个文本,最后保存到文件夹中就ok了

 var tableName = '表名字'; //对应的模板中的class名字和生成的cs文件的名字
    ejs.renderFile('./template/posts.ejs', { rows: res.rows, 'table': tableName}, (err, str) => {
        if (err) {
            console.error(err);
        }
        else {
            let temp = path.join(__dirname, 'temp');
            var exist = fs.existsSync(temp)
            if (!exist) {
                fs.mkdirSync()
            }
            fs.writeFile(path.join(temp, tableName+'.cs'), str, (err) => {
                if (err) {
                    console.error(err);
                } else {
                    console.log('生成模板成功');
                }
            })

        }
    })

使用node执行一下,就能生成出一个cs文件了。

由于我表很少,我就单个生成就好了。若是要扩展出整个数据库都生成,能够再写几行代码就能整个库都生成了!


 

须要交流的老铁们能够点击博客下边的连接或直接搜索群号加入QQ群:545594312

相关文章
相关标签/搜索