2018-12-18 20:09:52 +08:00

239 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 => {
if (cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) {
return $"{UString(cola3.Table.Name)}{cola3.Name.ToUpper()}{(cola3.IsNullable ? "?" : "")}";
}
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 mysql => Const.mysql;
public static ISelect<{#UString(table.Name)}> Select => mysql.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}
{/if}{if (table.Uniques.Count > 0)}{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 = mysql.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}{%
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 mysql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存
}
{/for}{if (table.Uniques.Count > 0)}{% 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 (mysql.Ado.TransactionCurrentThread != null) mysql.Ado.TransactionPreRemoveCache(keys);
else mysql.Cache.Remove(keys);
}
{/if}{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)})mysql.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();
}
public static long Insert(IEnumerable<{#UString(table.Name)}> items) {
if (ItemCacheTimeout > 0) RemoveCache(items);
return mysql.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();
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();
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();
}
public static long Update(IEnumerable<{#UString(table.Name)}> items) {
if (ItemCacheTimeout > 0) RemoveCache(items);
return mysql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows();
}
/// <summary>
/// 指定字段更新
/// </summary>
public IUpdate<{#UString(table.Name)}> UpdateDiy => mysql.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();
if (affrows > 0) return;
}{/if}
{if pks.Count > 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}
}
{include ../../include/enumtype.tpl}
}