tijian_tieying/web/cyqdata-master/Orm/SimpleOrmBase.cs

505 lines
15 KiB
C#
Raw Normal View History

2025-02-20 12:14:39 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using CYQ.Data.Table;
using System.Reflection;
using CYQ.Data.Tool;
using CYQ.Data.Cache;
using CYQ.Data.SQL;
using System.Data;
using CYQ.Data.Aop;
namespace CYQ.Data.Orm
{
/// <summary>
/// ORM CodeFirst <20>ֶ<EFBFBD><D6B6><EFBFBD>Դ
/// </summary>
public enum FieldSource
{
/// <summary>
/// <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
Property,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
Data,
/// <summary>
/// <20>ۺ<EFBFBD><DBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
BothOfAll
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ORM<52><4D><EFBFBD><EFBFBD><E0A3A8><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>
/// </summary>
public class SimpleOrmBase : IDisposable
{
internal MDataColumn Columns = null;
/// <summary>
/// <20><>ʶ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>־<EFBFBD><D6BE>
/// </summary>
internal bool AllowWriteLog
{
set
{
Action.dalHelper.isAllowInterWriteLog = value;
}
}
/// <summary>
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AOP<4F><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ֵͬ<D6B5><CDAC><EFBFBD><EFBFBD>
/// </summary>
internal bool IsUseAop = false;
private static FieldSource _FieldSource = FieldSource.BothOfAll;
/// <summary>
/// <20>ֶ<EFBFBD><D6B6><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ֶα<D6B6><CEB1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>£<EFBFBD>
/// </summary>
public static FieldSource FieldSource
{
get
{
return _FieldSource;
}
set
{
_FieldSource = value;
}
}
Object entity;//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Type typeInfo;//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private MAction _Action;
internal MAction Action
{
get
{
if (_Action == null)
{
SetDelayInit(_entityInstance, _tableName, _conn, _op);//<2F>ӳټ<D3B3><D9BC><EFBFBD>
}
return _Action;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><ECBAAF>
/// </summary>
public SimpleOrmBase()
{
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Aop״̬
/// </summary>
/// <param name="op"></param>
public void SetAopState(AopOp op)
{
Action.SetAopState(op);
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>״̬[<5B>̳д˻<D0B4><CBBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˷<C3B4><CBB7><EFBFBD>]
/// </summary>
/// <param name="entityInstance">ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>д:this</param>
protected void SetInit(Object entityInstance)
{
SetInit(entityInstance, null, AppConfig.DB.DefaultConn);
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>״̬[<5B>̳д˻<D0B4><CBBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˷<C3B4><CBB7><EFBFBD>]
/// </summary>
/// <param name="entityInstance">ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>д:this</param>
/// <param name="tableName"><3E><><EFBFBD><EFBFBD>,<2C><>:Users</param>
protected void SetInit(Object entityInstance, string tableName)
{
SetInit(entityInstance, tableName, AppConfig.DB.DefaultConn);
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>״̬[<5B>̳д˻<D0B4><CBBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˷<C3B4><CBB7><EFBFBD>]
/// </summary>
/// <param name="entityInstance">ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<><D2BB>д:this</param>
/// <param name="tableName"><3E><><EFBFBD><EFBFBD>,<2C><>:Users</param>
/// <param name="conn"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>ʱ<EFBFBD><CAB1>дNull,<2C><>дĬ<D0B4><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"Conn",<2C><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD></param>
protected void SetInit(Object entityInstance, string tableName, string conn)
{
SetInit(entityInstance, tableName, conn, AopOp.OpenAll);
}
private object _entityInstance;
private string _tableName;
private string _conn;
private AopOp _op;
protected void SetInit(Object entityInstance, string tableName, string conn, AopOp op)
{
_entityInstance = entityInstance;
_tableName = tableName;
_conn = conn;
_op = op;
}
/// <summary>
/// <20><>ԭ<EFBFBD>еij<D0B5>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ء<EFBFBD>
/// </summary>
private void SetDelayInit(Object entityInstance, string tableName, string conn, AopOp op)
{
conn = string.IsNullOrEmpty(conn) ? AppConfig.DB.DefaultConn : conn;
entity = entityInstance;
typeInfo = entity.GetType();
try
{
if (string.IsNullOrEmpty(tableName))
{
tableName = typeInfo.Name;
if (tableName.EndsWith(AppConfig.EntitySuffix))
{
tableName = tableName.Substring(0, tableName.Length - AppConfig.EntitySuffix.Length);
}
}
string key = tableName + StaticTool.GetHashKey(conn);
if (!CacheManage.LocalInstance.Contains(key))
{
DalType dal = DBTool.GetDalType(conn);
bool isTxtDal = dal == DalType.Txt || dal == DalType.Xml;
string errMsg = string.Empty;
Columns = DBTool.GetColumns(tableName, conn, out errMsg);//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><ECB3A3>
if (Columns == null || Columns.Count == 0)
{
if (errMsg != string.Empty)
{
Error.Throw(errMsg);
}
Columns = TableSchema.GetColumns(typeInfo);
if (!DBTool.ExistsTable(tableName, conn))
{
DBTool.ErrorMsg = null;
if (!DBTool.CreateTable(tableName, Columns, conn))
{
Error.Throw("SimpleOrmBase <20><>Create Table Error:" + tableName + DBTool.ErrorMsg);
}
}
}
else if (isTxtDal)//<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ݿ<EFBFBD>
{
if (FieldSource != FieldSource.Data)
{
MDataColumn c2 = TableSchema.GetColumns(typeInfo);
if (FieldSource == FieldSource.BothOfAll)
{
Columns.AddRange(c2);
}
else
{
Columns = c2;
}
}
}
if (Columns != null && Columns.Count > 0)
{
CacheManage.LocalInstance.Set(key, Columns, 1440, null);
}
}
else
{
Columns = CacheManage.LocalInstance.Get(key) as MDataColumn;
}
_Action = new MAction(Columns.ToRow(tableName), conn);
if (typeInfo.Name == "SysLogs")
{
_Action.SetAopState(Aop.AopOp.CloseAll);
}
else
{
_Action.SetAopState(op);
}
_Action.EndTransation();
}
catch (Exception err)
{
if (typeInfo.Name != "SysLogs")
{
Log.WriteLogToTxt(err);
}
throw;
}
}
internal void SetInit2(Object entityInstance, string tableName, string conn, AopOp op)
{
SetInit(entityInstance, tableName, conn, op);
}
internal void SetInit2(Object entityInstance, string tableName, string conn)
{
SetInit(entityInstance, tableName, conn);
}
internal void Set(object key, object value)
{
if (Action != null)
{
Action.Set(key, value);
}
}
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD>IJ<EFBFBD> <EFBFBD><EFBFBD>Ա
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Insert()
{
return Insert(InsertOp.ID);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="option"><3E><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1></param>
public bool Insert(InsertOp option)
{
return Insert(false, option, false);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="insertID"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
public bool Insert(InsertOp option, bool insertID)
{
return Insert(false, option, insertID);
}
/*
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="autoSetValue"><3E>Զ<EFBFBD><D4B6>ӿ<EFBFBD><D3BF>ƻ<EFBFBD>ȡֵ</param>
internal bool Insert(bool autoSetValue)
{
return Insert(autoSetValue, InsertOp.ID);
}
internal bool Insert(bool autoSetValue, InsertOp option)
{
return Insert(autoSetValue, InsertOp.ID, false);
}*/
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="autoSetValue"><3E>Զ<EFBFBD><D4B6>ӿ<EFBFBD><D3BF>ƻ<EFBFBD>ȡֵ</param>
/// <param name="option"><3E><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1></param>
/// <param name="insertID"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
internal bool Insert(bool autoSetValue, InsertOp option, bool insertID)
{
if (autoSetValue)
{
Action.UI.GetAll(!insertID);
}
GetValueFromEntity();
Action.AllowInsertID = insertID;
bool result = Action.Insert(false, option);
if (autoSetValue || option != InsertOp.None)
{
SetValueToEntity();
}
return result;
}
#endregion
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Update()
{
return Update(null, false);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="where">where<72><65><EFBFBD><EFBFBD>,<2C><>ֱ<EFBFBD>Ӵ<EFBFBD>id<69><64>ֵ<EFBFBD><D6B5>:[88],<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>where<72><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[id=88 and name='·<><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>']</param>
public bool Update(object where)
{
return Update(where, false);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="where">where<72><65><EFBFBD><EFBFBD>,<2C><>ֱ<EFBFBD>Ӵ<EFBFBD>id<69><64>ֵ<EFBFBD><D6B5>:[88],<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>where<72><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[id=88 and name='·<><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>']</param>
/// <param name="autoSetValue"><3E>Ƿ<EFBFBD><C7B7>Զ<EFBFBD><D4B6><EFBFBD>ȡֵ[<5B>Զ<EFBFBD><D4B6>ӿؼ<D3BF><D8BC><EFBFBD>ȡֵ,<2C><>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>SetAutoPrefix<69><78>SetAutoParentControl<6F><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿؼ<C3BF>ǰ׺]</param>
internal bool Update(object where, bool autoSetValue)
{
if (autoSetValue)
{
Action.UI.GetAll(false);
}
GetValueFromEntity();
bool result = Action.Update(where);
if (autoSetValue)
{
SetValueToEntity();
}
return result;
}
#endregion
#region ɾ<EFBFBD><EFBFBD>
/// <summary>
/// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Delete()
{
return Delete(null);
}
/// <summary>
/// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="where">where<72><65><EFBFBD><EFBFBD>,<2C><>ֱ<EFBFBD>Ӵ<EFBFBD>id<69><64>ֵ<EFBFBD><D6B5>:[88],<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>where<72><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[id=88 and name='·<><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>']</param>
public bool Delete(object where)
{
GetValueFromEntity();
return Action.Delete(where);
}
#endregion
#region <EFBFBD><EFBFBD>ѯ
/// <summary>
/// <20><>ѯ1<D1AF><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Fill()
{
return Fill(null);
}
/// <summary>
/// <20><>ѯ1<D1AF><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Fill(object where)
{
bool result = Action.Fill(where);
if (result)
{
SetValueToEntity();
}
return result;
}
/// <summary>
/// <20>б<EFBFBD><D0B1><EFBFBD>ѯ
/// </summary>
public List<T> Select<T>()
{
int count = 0;
return Select<T>(0, 0, null, out count);
}
/// <summary>
/// <20>б<EFBFBD><D0B1><EFBFBD>ѯ
/// </summary>
/// <param name="where"><3E><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>[<5B>ɸ<EFBFBD><C9B8><EFBFBD> order by <20><><EFBFBD><EFBFBD>]</param>
/// <returns></returns>
public List<T> Select<T>(string where)
{
int count = 0;
return Select<T>(0, 0, where, out count);
}
/// <summary>
/// <20>б<EFBFBD><D0B1><EFBFBD>ѯ
/// </summary>
/// <param name="topN"><3E><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD></param>
/// <param name="where"><3E><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>[<5B>ɸ<EFBFBD><C9B8><EFBFBD> order by <20><><EFBFBD><EFBFBD>]</param>
/// <returns></returns>
public List<T> Select<T>(int topN, string where)
{
int count = 0;
return Select<T>(0, topN, where, out count);
}
public List<T> Select<T>(int pageIndex, int pageSize)
{
int count = 0;
return Select<T>(pageIndex, pageSize, null, out count);
}
public List<T> Select<T>(int pageIndex, int pageSize, string where)
{
int count = 0;
return Select<T>(pageIndex, pageSize, where, out count);
}
/// <summary>
/// <20><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD>ܵ<EFBFBD>ѡ<EFBFBD><D1A1>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ,ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱֻ<CAB1><D6BB><EFBFBD><EFBFBD>PageIndex/PageSize<7A><65><EFBFBD><EFBFBD>Ϊ0]
/// </summary>
/// <param name="pageIndex"><3E>ڼ<EFBFBD>ҳ</param>
/// <param name="pageSize">ÿҳ<C3BF><D2B3><EFBFBD><EFBFBD>[Ϊ0ʱĬ<CAB1><C4AC>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]</param>
/// <param name="where"> <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>[<5B>ɸ<EFBFBD><C9B8><EFBFBD> order by <20><><EFBFBD><EFBFBD>]</param>
/// <param name="count"><3E><><EFBFBD>صļ<D8B5>¼<EFBFBD><C2BC><EFBFBD><EFBFBD></param>
public List<T> Select<T>(int pageIndex, int pageSize, string where, out int count)
{
return Action.Select(pageIndex, pageSize, where, out count).ToList<T>();
}
internal MDataTable Select(int pageIndex, int pageSize, string where, out int count)
{
return Action.Select(pageIndex, pageSize, where, out count);
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
/// </summary>
public int GetCount(object where)
{
return Action.GetCount(where);
}
/// <summary>
/// <20><>ѯ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool Exists(object where)
{
return Action.Exists(where);
}
#endregion
#endregion
internal void SetValueToEntity()
{
SetValueToEntity(null);
}
internal void SetValueToEntity(string propName)
{
if (!string.IsNullOrEmpty(propName))
{
PropertyInfo pi = typeInfo.GetProperty(propName);
if (pi != null)
{
MDataCell cell = Action.Data[propName];
if (cell != null && !cell.IsNull)
{
try
{
pi.SetValue(entity, cell.Value, null);
}
catch
{
}
}
}
}
else
{
Action.Data.SetToEntity(entity);
}
}
private void GetValueFromEntity()
{
if (!IsUseAop || AppConfig.IsAspNetCore)//ASPNETCore<72>£<EFBFBD><C2A3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Aop<6F><70><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
{
Action.Data.LoadFrom(entity, BreakOp.Null);
}
}
#region IDisposable <EFBFBD><EFBFBD>Ա
/// <summary>
/// <20>ͷ<EFBFBD><CDB7><EFBFBD>Դ
/// </summary>
public void Dispose()
{
if (Action != null)
{
Action.Dispose();
}
}
#endregion
}
}