sqlserver CodeFirst DbFirst 测试通过

This commit is contained in:
28810
2018-12-19 15:17:44 +08:00
parent 751b240533
commit d619d29cfa
22 changed files with 1336 additions and 332 deletions

View File

@ -0,0 +1,5 @@
public static class Const {
public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, "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();
}

View File

@ -0,0 +1,240 @@
{%if (table.Type == DbTableType.StoreProcedure) {
print("return;");
return rTn;
}
%}using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json;
using FreeSql;
using FreeSql.DataAnnotations;
{%
var dbf = dbfirst as FreeSql.IDbFirst;
var cols = (table.Columns as List<DbColumnInfo>);
var pks = (table.Primarys as List<DbColumnInfo>);
var fks = (table.Foreigns as List<DbForeignInfo>);
Func<string, string> UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1);
Func<DbColumnInfo, string> GetCsType = cola3 => {
return dbf.GetCsType(cola3);
};
Func<DbForeignInfo, string> GetFkObjectName = fkx => {
var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name);
if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name;
var fkretname = fkx.Columns[0].Name;
if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_');
if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_');
if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_');
return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname));
};
%}
namespace test.Model {
[JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})]
public partial class {#UString(table.Name)} {{for col,index in table.Columns}{%
var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any());
%}{if findfks.Any() == false}
{if string.IsNullOrEmpty(col.Coment) == false}/// <summary>
/// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")}
/// </summary>{/if}
[JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})]
public {#GetCsType(col)} {#UString(col.Name)} { get; set; }
{else}
private {#GetCsType(col)} _{#UString(col.Name)};
{if string.IsNullOrEmpty(col.Coment) == false}/// <summary>
/// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")}
/// </summary>{/if}
[JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})]
public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set {
if (_{#UString(col.Name)} == value) return;
_{#UString(col.Name)} = value;{for fkcok2 in findfks}
{#GetFkObjectName(fkcok2)} = null;{/for}
} }
{/if}{/for}{for fk in fks}
public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; }
{/for}
internal static IFreeSql freesql => Const.sqlserver;
public static ISelect<{#UString(table.Name)}> Select => freesql.Select<{#UString(table.Name)}>();
{if (table.Uniques.Count > 0)}
public static int ItemCacheTimeout = 180;{for uk001 in table.Uniques}{%
string parms = string.Empty;
string parmsByWhereLambda = string.Empty;
string parmsBy = "By";
string parmsNodeTypeUpdateCacheRemove = string.Empty;
foreach (var uk001col in uk001) {
string getcstype = GetCsType(uk001col);
parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", ";
parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && ";
parmsBy += UString(uk001col.Name) + "And";
parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", ";
}
parms = parms.Substring(0, parms.Length - 2);
parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4);
parmsBy = parmsBy.Substring(0, parmsBy.Length - 3);
parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9);
%}
public static {#UString(table.Name)} GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) => Select.Where(a => {#parmsByWhereLambda}).Caching(ItemCacheTimeout, string.Concat("test:{#table.Name}{#uk001[0].IsPrimary ? string.Empty : parmsBy}:", {#parmsNodeTypeUpdateCacheRemove.Replace("item.", "")})).ToOne();{/for}
{for uk001 in table.Uniques}{%
string parms = string.Empty;
string parmsByWhereLambda = string.Empty;
string parmsNewItem = string.Empty;
string parmsBy = "By";
string parmsNoneType = string.Empty;
foreach (var uk001col in uk001) {
string getcstype = GetCsType(uk001col);
parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", ";
parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && ";
parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", ";
parmsBy += UString(uk001col.Name) + "And";
parmsNoneType += UString(uk001col.Name) + ", ";
}
parms = parms.Substring(0, parms.Length - 2);
parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4);
parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2);
parmsBy = parmsBy.Substring(0, parmsBy.Length - 3);
parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2);
%}
public static long Delete{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) {
var affrows = freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();{if table.Uniques.Count > 1}
if (ItemCacheTimeout > 0) RemoveCache(GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parmsNoneType}));{else}
if (ItemCacheTimeout > 0) RemoveCache(new {#UString(table.Name)} { {#parmsNewItem} });{/if}
return affrows;
}{/for}
{for fkcoldel in fks}{%
string parms = string.Empty;
string parmsBy = "By";
string parmsByWhereLambda = string.Empty;
foreach( var fkcoldelcol in fkcoldel.Columns) {
string getcstype = GetCsType(fkcoldelcol);
parms += getcstype.Replace("?", "") + " " + UString(fkcoldelcol.Name) + ", ";
parmsBy += UString(fkcoldelcol.Name) + "And";
parmsByWhereLambda += "a." + UString(fkcoldelcol.Name) + " == " + UString(fkcoldelcol.Name) + " && ";
}
parms = parms.Substring(0, parms.Length - 2);
parmsBy = parmsBy.Substring(0, parmsBy.Length - 3);
parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4);
%}
public static long DeleteBy{#parmsBy}({#parms}) {
return freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存
}
{/for}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{%
string parmsBy = "By";
string parmsNodeTypeUpdateCacheRemove = string.Empty;
foreach (var uk001col in uk001) {
parmsBy += UString(uk001col.Name) + "And";
parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", ";
}
parmsBy = parmsBy.Substring(0, parmsBy.Length - 3);
parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9);
redisRemoveCode += $@"
keys[keysIdx++] = string.Concat(""test:{table.Name}{(uk001[0].IsPrimary ? string.Empty : parmsBy)}:"", {parmsNodeTypeUpdateCacheRemove});";
%}{/for}
internal static void RemoveCache({#UString(table.Name)} item) => RemoveCache(item == null ? null : new [] { item });
internal static void RemoveCache(IEnumerable<{#UString(table.Name)}> items) {
if (ItemCacheTimeout <= 0 || items == null || items.Any() == false) return;
var keys = new string[items.Count() * {#table.Uniques.Count}];
var keysIdx = 0;
foreach (var item in items) {{#redisRemoveCode}
}
if (freesql.Ado.TransactionCurrentThread != null) freesql.Ado.TransactionPreRemoveCache(keys);
else freesql.Cache.Remove(keys);
}
{if (table.Columns.Count < 100)}{%
string CsParam3 = string.Empty;
string CsParamNoType3 = string.Empty;
string parms = string.Empty;
string parmsByWhereLambda = string.Empty;
string parmsNewItem = string.Empty;
string parmsBy = "By";
string parmsNoneType = string.Empty;
var idens = 0;
var idensCol = table.Columns[0];
foreach (var uk001col in table.Columns) {
string getcstype = GetCsType(uk001col);
parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", ";
if (uk001col.IsPrimary)
parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && ";
parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", ";
parmsBy += UString(uk001col.Name) + "And";
parmsNoneType += UString(uk001col.Name) + ", ";
if (uk001col.IsIdentity) {
idens++;
idensCol = uk001col;
} else {
if (getcstype.StartsWith("DateTime") && (uk001col.Name.ToLower() == "create_time" || uk001col.Name.ToLower() == "update_time" || uk001col.Name.ToLower() == "createtime" || uk001col.Name.ToLower() == "updatetime") ||
getcstype == "bool?" && (uk001col.Name.ToLower() == "is_deleted" || uk001col.Name.ToLower() == "isdeleted")) {
} else {
CsParam3 += getcstype + " " + UString(uk001col.Name) + ", ";
CsParamNoType3 += string.Format("\r\n {0} = {0}, ", UString(uk001col.Name));
}
}
}
parms = parms.Substring(0, parms.Length - 2);
if (parmsByWhereLambda.Length > 0) parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4);
parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2);
parmsBy = parmsBy.Substring(0, parmsBy.Length - 3);
parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2);
if (CsParam3.Length > 0) CsParam3 = CsParam3.Substring(0, CsParam3.Length - 2);
if (CsParamNoType3.Length > 0) CsParamNoType3 = CsParamNoType3.Substring(0, CsParamNoType3.Length - 2);
%}{if idens > 0}
public static {#GetCsType(idensCol)} Insert({#UString(table.Name)} item) {
item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteIdentity();
if (ItemCacheTimeout > 0) RemoveCache(item);
return item.{#UString(idensCol.Name)};
}{else}
public static void Insert({#UString(table.Name)} item) {
if (ItemCacheTimeout > 0) RemoveCache(item);
freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows();
}
public static long Insert(IEnumerable<{#UString(table.Name)}> items) {
if (ItemCacheTimeout > 0) RemoveCache(items);
return freesql.Insert<{#UString(table.Name)}>().AppendData(items).ExecuteAffrows();
}{/if}
{if CsParamNoType3.Split('=').Length <= 5}{if idens > 0}
public static {#GetCsType(idensCol)} Insert({#CsParam3}) {
var item = new {#UString(table.Name)} {{#CsParamNoType3}};
item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(new {#UString(table.Name)} {{#CsParamNoType3}}).ExecuteIdentity();
if (ItemCacheTimeout > 0) RemoveCache(item);
return item.{#UString(idensCol.Name)};
}{else}
public static {#UString(table.Name)} Insert({#CsParam3}) {
var item = new {#UString(table.Name)} {{#CsParamNoType3}};
freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows();
if (ItemCacheTimeout > 0) RemoveCache(item);
return item;
}{/if}{/if}
public static long Update({#UString(table.Name)} item) {
if (ItemCacheTimeout > 0) RemoveCache(item);
return freesql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows();
}
public static long Update(IEnumerable<{#UString(table.Name)}> items) {
if (ItemCacheTimeout > 0) RemoveCache(items);
return freesql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows();
}
/// <summary>
/// 指定字段更新
/// </summary>
public IUpdate<{#UString(table.Name)}> UpdateDiy => freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda});
/// <summary>
/// {if pks.Count > 0}保存或添加,如果主键有值则尝试 Update如果影响的行为 0 则尝试 Insert{else}添加{/if}
/// </summary>
public void Save() {{if pks.Count > 0}
if ({#string.Join(" && ", pks.Select(pkssa => "this." + UString(pkssa.Name) + " != default(" + GetCsType(pkssa) + ")"))}) {
var affrows = freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();
if (affrows > 0) return;
}{/if}
{if idens > 0}this.{#UString(idensCol.Name)} = {#GetCsType(idensCol).Replace("?", "") == "long" ? "" : ("(" + GetCsType(idensCol) + ")")}freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteIdentity();{else}
freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteAffrows();{/if}
}
{/if}{/if}
}
}

View File

@ -0,0 +1,94 @@
# 生成器
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
| ------------- | - | - |- | - |- | - |
| simple-entity | √ | X | X | √ | X | X |
| simple-entity-navigation-object | √ | √ | X | √ | X | X |
| rich-entity-navigation-object | √ | √ | √ | X | √ | X |
模板在项目目录:/Templates/MySql
> 更多模板逐步开发中。。。
```csharp
//定义 mysql FreeSql
var mysql = 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 gen = new FreeSql.Generator.TemplateGenerator();
gen.Build(mysql.DbFirst,
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
"cccddd" //数据库
);
```
## 模板语法
```html
<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>
```

View File

@ -0,0 +1,59 @@
{%if (table.Type == DbTableType.StoreProcedure) {
print("return;");
return rTn;
}
%}using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json;
using FreeSql.DataAnnotations;
{%
var dbf = dbfirst as FreeSql.IDbFirst;
var cols = (table.Columns as List<DbColumnInfo>);
var pks = (table.Primarys as List<DbColumnInfo>);
var fks = (table.Foreigns as List<DbForeignInfo>);
Func<string, string> UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1);
Func<DbColumnInfo, string> GetCsType = cola3 => {
return dbf.GetCsType(cola3);
};
Func<DbForeignInfo, string> GetFkObjectName = fkx => {
var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name);
if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name;
var fkretname = fkx.Columns[0].Name;
if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_');
if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_');
if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_');
return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname));
};
%}
namespace test.Model {
[JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})]
public partial class {#UString(table.Name)} {{for col,index in table.Columns}{%
var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any());
%}{if findfks.Any() == false}
{if string.IsNullOrEmpty(col.Coment) == false}/// <summary>
/// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")}
/// </summary>{/if}
[JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})]
public {#GetCsType(col)} {#UString(col.Name)} { get; set; }
{else}
private {#GetCsType(col)} _{#UString(col.Name)};
{if string.IsNullOrEmpty(col.Coment) == false}/// <summary>
/// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")}
/// </summary>{/if}
[JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})]
public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set {
if (_{#UString(col.Name)} == value) return;
_{#UString(col.Name)} = value;{for fkcok2 in findfks}
{#GetFkObjectName(fkcok2)} = null;{/for}
} }
{/if}{/for}{for fk in fks}
public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; }
{/for}
}
}

View File

@ -0,0 +1,94 @@
# 生成器
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
| ------------- | - | - |- | - |- | - |
| simple-entity | √ | X | X | √ | X | X |
| simple-entity-navigation-object | √ | √ | X | √ | X | X |
| rich-entity-navigation-object | √ | √ | √ | X | √ | X |
模板在项目目录:/Templates/MySql
> 更多模板逐步开发中。。。
```csharp
//定义 mysql FreeSql
var mysql = 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 gen = new FreeSql.Generator.TemplateGenerator();
gen.Build(mysql.DbFirst,
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
"cccddd" //数据库
);
```
## 模板语法
```html
<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>
```

View File

@ -0,0 +1,33 @@
{%if (table.Type == DbTableType.StoreProcedure) {
print("return;");
return rTn;
}
%}using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json;
using FreeSql.DataAnnotations;
{%
var dbf = dbfirst as FreeSql.IDbFirst;
var cols = (table.Columns as List<DbColumnInfo>);
Func<string, string> UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1);
Func<DbColumnInfo, string> GetCsType = cola3 => {
return dbf.GetCsType(cola3);
};
%}
namespace test.Model {
[JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})]
public partial class {#UString(table.Name)} {{for col,index in table.Columns}
{if string.IsNullOrEmpty(col.Coment) == false}/// <summary>
/// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")}
/// </summary>{/if}
[JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})]
public {#GetCsType(col)} {#UString(col.Name)} { get; set; }
{/for}
}
}

View File

@ -0,0 +1,94 @@
# 生成器
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
| ------------- | - | - |- | - |- | - |
| simple-entity | √ | X | X | √ | X | X |
| simple-entity-navigation-object | √ | √ | X | √ | X | X |
| rich-entity-navigation-object | √ | √ | √ | X | √ | X |
模板在项目目录:/Templates/MySql
> 更多模板逐步开发中。。。
```csharp
//定义 mysql FreeSql
var mysql = 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 gen = new FreeSql.Generator.TemplateGenerator();
gen.Build(mysql.DbFirst,
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
"cccddd" //数据库
);
```
## 模板语法
```html
<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>
```