mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	sqlserver CodeFirst DbFirst 测试通过
This commit is contained in:
		@@ -57,8 +57,8 @@ namespace test.Model {
 | 
			
		||||
		{/if}{/for}{for fk in fks}
 | 
			
		||||
		public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; }
 | 
			
		||||
		{/for}
 | 
			
		||||
		internal static IFreeSql mysql => Const.mysql;
 | 
			
		||||
		public static ISelect<{#UString(table.Name)}> Select => mysql.Select<{#UString(table.Name)}>();
 | 
			
		||||
		internal static IFreeSql freesql => Const.mysql;
 | 
			
		||||
		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}{%
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +79,7 @@ namespace test.Model {
 | 
			
		||||
		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}
 | 
			
		||||
{/if}{if (table.Uniques.Count > 0)}{for uk001 in table.Uniques}{%
 | 
			
		||||
{for uk001 in table.Uniques}{%
 | 
			
		||||
 | 
			
		||||
		string parms = string.Empty;
 | 
			
		||||
		string parmsByWhereLambda = string.Empty;
 | 
			
		||||
@@ -101,12 +101,12 @@ namespace test.Model {
 | 
			
		||||
		parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2);
 | 
			
		||||
		%}
 | 
			
		||||
		public static long Delete{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) {
 | 
			
		||||
			var affrows = mysql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();{if table.Uniques.Count > 1}
 | 
			
		||||
			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}
 | 
			
		||||
{/if}{for fkcoldel in fks}{%
 | 
			
		||||
{for fkcoldel in fks}{%
 | 
			
		||||
		string parms = string.Empty;
 | 
			
		||||
		string parmsBy = "By";
 | 
			
		||||
		string parmsByWhereLambda = string.Empty;
 | 
			
		||||
@@ -121,9 +121,9 @@ namespace test.Model {
 | 
			
		||||
		parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4);
 | 
			
		||||
		%}
 | 
			
		||||
		public static long DeleteBy{#parmsBy}({#parms}) {
 | 
			
		||||
			return mysql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存
 | 
			
		||||
			return freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存
 | 
			
		||||
		}
 | 
			
		||||
{/for}{if (table.Uniques.Count > 0)}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{%
 | 
			
		||||
{/for}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{%
 | 
			
		||||
 | 
			
		||||
		string parmsBy = "By";
 | 
			
		||||
		string parmsNodeTypeUpdateCacheRemove = string.Empty;
 | 
			
		||||
@@ -143,10 +143,10 @@ namespace test.Model {
 | 
			
		||||
			var keysIdx = 0;
 | 
			
		||||
			foreach (var item in items) {{#redisRemoveCode}
 | 
			
		||||
			}
 | 
			
		||||
			if (mysql.Ado.TransactionCurrentThread != null) mysql.Ado.TransactionPreRemoveCache(keys);
 | 
			
		||||
			else mysql.Cache.Remove(keys);
 | 
			
		||||
			if (freesql.Ado.TransactionCurrentThread != null) freesql.Ado.TransactionPreRemoveCache(keys);
 | 
			
		||||
			else freesql.Cache.Remove(keys);
 | 
			
		||||
		}
 | 
			
		||||
{/if}{if (table.Columns.Count < 100)}{%
 | 
			
		||||
{if (table.Columns.Count < 100)}{%
 | 
			
		||||
		string CsParam3 = string.Empty;
 | 
			
		||||
		string CsParamNoType3 = string.Empty;
 | 
			
		||||
		string parms = string.Empty;
 | 
			
		||||
@@ -186,55 +186,55 @@ namespace test.Model {
 | 
			
		||||
		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)})mysql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteIdentity();
 | 
			
		||||
			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);
 | 
			
		||||
			mysql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows();
 | 
			
		||||
			freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows();
 | 
			
		||||
		}
 | 
			
		||||
		public static long Insert(IEnumerable<{#UString(table.Name)}> items) {
 | 
			
		||||
			if (ItemCacheTimeout > 0) RemoveCache(items);
 | 
			
		||||
			return mysql.Insert<{#UString(table.Name)}>().AppendData(items).ExecuteAffrows();
 | 
			
		||||
			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)})mysql.Insert<{#UString(table.Name)}>().AppendData(new {#UString(table.Name)} {{#CsParamNoType3}}).ExecuteIdentity();
 | 
			
		||||
			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}};
 | 
			
		||||
			mysql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows();
 | 
			
		||||
			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 mysql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows();
 | 
			
		||||
			return freesql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows();
 | 
			
		||||
		}
 | 
			
		||||
		public static long Update(IEnumerable<{#UString(table.Name)}> items) {
 | 
			
		||||
			if (ItemCacheTimeout > 0) RemoveCache(items);
 | 
			
		||||
			return mysql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows();
 | 
			
		||||
			return freesql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows();
 | 
			
		||||
		}
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 指定字段更新
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public IUpdate<{#UString(table.Name)}> UpdateDiy => mysql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda});
 | 
			
		||||
		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 = mysql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();
 | 
			
		||||
				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) + ")")}mysql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteIdentity();{else}
 | 
			
		||||
			mysql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteAffrows();{/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}{/if}
 | 
			
		||||
	}
 | 
			
		||||
{include ../../include/enumtype.tpl}
 | 
			
		||||
}
 | 
			
		||||
@@ -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>
 | 
			
		||||
```
 | 
			
		||||
		Reference in New Issue
	
	Block a user