Skip to content

DbFirst

28810 edited this page May 7, 2019 · 29 revisions

FreeSql 同样支持 DbFirst 的开发模式,即先有数据库再有项目,这种传统的开发模式永远不会过时,特别适合老项目仍然在维护,或者数据库重构成本过高的项目。关系型数据库有许多成熟的运维和开发类配套工具,例如我们所关注的ER图工具 PowerdeSigner,使用它可以更直观的查看表之间的关系。除了FreeSql作者同时在维护超过十年的代码生成器dotnetGen项目,它是一款支持超快速开发且高度可控的解决方案,作者非常喜欢 DbFirst 的开发模式,因此在 FreeSql for DbFirst 功能上会有不错的支持。

DbFirst 模式开发主要提供了不同数据库的表结构查询适配,配合模板生成器实现从数据库导入模型到c#代码中。

IFreeSql fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
    .Build();

获取所有数据库

var t1 = fsql.DbFirst.GetDatabases();
//返回字符串数组, ["cccddd", "test"]

获取指定数据库的表信息

var t2 = fsql.DbFirst.GetTablesByDatabase(fsql.DbFirst.GetDatabases()[0]);
//返回包括表、列详情、主键、唯一键、索引、外键、备注等等

生成器

生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:

模板名称 路径 类型映射 外键导航属性 缓存管理 失血 贫血 充血
simple-entity ../Templates/MySql/simple-entity X X X X
simple-entity-navigation-object ../Templates/MySql/simple-entity-navigation-object X X X
rich-entity-navigation-object ../Templates/MySql/rich-entity-navigation-object X X

更多模板逐步开发中。。。

//创建模板生成类实现
var gen = new FreeSql.Generator.TemplateGenerator();
gen.Build(fsql.DbFirst, 
    @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity",  //模板目录(事先下载)
    @"C:\Users\28810\Desktop\新建文件夹 (9)",  //生成后保存的目录
    "cccddd" //数据库
);

模板语法

<html>
<head>
<title>{#title}</title>
</head>
<body>

<!--绑定表达式-->
{#表达式}
{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高

<!--可嵌套使用,同一标签最多支持3个指令-->
{include ../header.html}
<div @for="i 1, 101">
  <p @if="i === 50" @for="item,index in data">aaa</p>
  <p @else="i % 3 === 0">bbb {#i}</p>
  <p @else="">ccc {#i}</p>
</div>

<!--定义模块,可以将公共模块定义到一个文件中-->
{module module_name1 parms1, 2, 3...}
{/module}
{module module_name2 parms1, 2, 3...}
{/module}

<!--使用模块-->
{import ../module.html as myname}
{#myname.module_name(parms1, 2, 3...)}

<!--继承-->
{extends ../inc/layout.html}
{block body}{/block}

<!--嵌入代码块-->
{%
for (var a = 0; a < 100; a++)
  print(a);
%}

<!--条件分支-->
{if i === 50}
{elseif i > 60}
{else}
{/if}

<!--三种循环-->
{for i 1,101}                可自定义名 {for index2 表达式1 in 表达式2}

{for item,index in items}    可选参数称 index
                             可自定义名 {for item2, index99 in 数组表达式}

{for key,item,index on json} 可选参数 item, index,
                             可自定义名 {for key2, item2, index99 in 对象表达式}
{/for}

<!--不被解析-->
{miss}
此块内容不被bmw.js解析
{/miss}

</body>
</html>

参考资料

Clone this wiki locally