old_flsystem/类库/SqlSugar/5.0.0.9/SqlSugarClient.cs

910 lines
33 KiB
C#

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SqlSugar
{
public partial class SqlSugarClient : ISqlSugarClient, ITenant
{
#region Gobal Property
private SqlSugarProvider _Context = null;
private string _ThreadId;
private ConnectionConfig _CurrentConnectionConfig;
private List<SugarTenant> _AllClients;
private bool _IsAllTran = false;
private bool _IsOpen = false;
private MappingTableList _MappingTables;
private MappingColumnList _MappingColumns;
private IgnoreColumnList _IgnoreColumns;
private IgnoreColumnList _IgnoreInsertColumns;
internal Guid? AsyncId { get; set; }
internal bool? IsSingleInstance { get; set; }
#endregion
#region Constructor
public SqlSugarClient(ConnectionConfig config)
{
Check.Exception(config == null, "ConnectionConfig config is null");
InitContext(config);
}
public SqlSugarClient(List<ConnectionConfig> configs)
{
Check.Exception(configs.IsNullOrEmpty(), "List<ConnectionConfig> configs is null");
InitConfigs(configs);
var config = configs.First();
InitContext(config);
_AllClients = configs.Select(it => new SugarTenant() { ConnectionConfig = it }).ToList(); ;
_AllClients.First(it => it.ConnectionConfig.ConfigId == config.ConfigId).Context = this.Context;
}
#endregion
#region Global variable
public SqlSugarProvider Context { get { return GetContext(); } }
public bool IsSystemTablesConfig => this.Context.IsSystemTablesConfig;
public ConnectionConfig CurrentConnectionConfig { get { return _CurrentConnectionConfig; } set { _CurrentConnectionConfig = value; } }
public Guid ContextID { get { return this.Context.ContextID; } set { this.Context.ContextID = value; } }
public MappingTableList MappingTables { get { return _MappingTables; } set { _MappingTables = value; } }
public MappingColumnList MappingColumns { get { return _MappingColumns; } set { _MappingColumns = value; } }
public IgnoreColumnList IgnoreColumns { get { return _IgnoreColumns; } set { _IgnoreColumns = value; } }
public IgnoreColumnList IgnoreInsertColumns { get { return _IgnoreInsertColumns; } set { _IgnoreInsertColumns = value; } }
public Dictionary<string, object> TempItems { get { return this.Context.TempItems; } set { this.Context.TempItems = value; } }
#endregion
#region SimpleClient
public SimpleClient GetSimpleClient()
{
return this.Context.GetSimpleClient();
}
public SimpleClient<T> GetSimpleClient<T>() where T : class, new()
{
return this.Context.GetSimpleClient<T>();
}
#endregion
#region Insertable
public IInsertable<T> Insertable<T>(Dictionary<string, object> columnDictionary) where T : class, new()
{
return this.Context.Insertable<T>(columnDictionary);
}
public IInsertable<T> Insertable<T>(dynamic insertDynamicObject) where T : class, new()
{
return this.Context.Insertable<T>(insertDynamicObject);
}
public IInsertable<T> Insertable<T>(List<T> insertObjs) where T : class, new()
{
return this.Context.Insertable<T>(insertObjs);
}
public IInsertable<T> Insertable<T>(T insertObj) where T : class, new()
{
return this.Context.Insertable<T>(insertObj);
}
public IInsertable<T> Insertable<T>(T[] insertObjs) where T : class, new()
{
return this.Context.Insertable<T>(insertObjs);
}
#endregion
#region Queryable
#region Union
public ISugarQueryable<T> Union<T>(List<ISugarQueryable<T>> queryables) where T : class, new()
{
return this.Context.Union(queryables);
}
public ISugarQueryable<T> Union<T>(params ISugarQueryable<T>[] queryables) where T : class, new()
{
return this.Context.Union(queryables);
}
public ISugarQueryable<T> UnionAll<T>(List<ISugarQueryable<T>> queryables) where T : class, new()
{
return this.Context.UnionAll(queryables);
}
public ISugarQueryable<T> UnionAll<T>(params ISugarQueryable<T>[] queryables) where T : class, new()
{
return this.Context.UnionAll(queryables);
}
#endregion
public ISugarQueryable<T> SqlQueryable<T>(string sql) where T : class, new()
{
return this.Context.SqlQueryable<T>(sql);
}
public ISugarQueryable<ExpandoObject> Queryable(string tableName, string shortName)
{
return this.Context.Queryable(tableName, shortName);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, bool>> joinExpression) where T : class, new()
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, JoinQueryInfos>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, object[]>> joinExpression)
{
return this.Context.Queryable(joinExpression);
}
public ISugarQueryable<T, T2> Queryable<T, T2>(ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, Expression<Func<T, T2, bool>> joinExpression)
where T : class, new()
where T2 : class, new()
{
return this.Context.Queryable(joinQueryable1, joinQueryable2, joinExpression);
}
public ISugarQueryable<T, T2> Queryable<T, T2>(ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, JoinType joinType, Expression<Func<T, T2, bool>> joinExpression)
where T : class, new()
where T2 : class, new()
{
return this.Context.Queryable(joinQueryable1, joinQueryable2, joinType, joinExpression);
}
public ISugarQueryable<T> Queryable<T>()
{
return this.Context.Queryable<T>();
}
public ISugarQueryable<T> Queryable<T>(ISugarQueryable<T> queryable) where T : class, new()
{
return this.Context.Queryable<T>(queryable);
}
public ISugarQueryable<T> Queryable<T>(string shortName)
{
return this.Context.Queryable<T>(shortName);
}
#endregion
#region Saveable
public ISaveable<T> Saveable<T>(List<T> saveObjects) where T : class, new()
{
return this.Context.Saveable<T>(saveObjects);
}
public ISaveable<T> Saveable<T>(T saveObject) where T : class, new()
{
return this.Context.Saveable(saveObject);
}
#endregion
#region Queue
public QueueList Queues { get { return this.Context.Queues; } set { this.Context.Queues = value; } }
public void AddQueue(string sql, object parsmeters = null)
{
this.Context.AddQueue(sql, parsmeters);
}
public void AddQueue(string sql, List<SugarParameter> parsmeters)
{
this.Context.AddQueue(sql, parsmeters);
}
public void AddQueue(string sql, SugarParameter parsmeter)
{
this.Context.AddQueue(sql, parsmeter);
}
public int SaveQueues(bool isTran = true)
{
return this.Context.SaveQueues(isTran);
}
public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>, List<T7>> SaveQueues<T, T2, T3, T4, T5, T6, T7>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2, T3, T4, T5, T6, T7>(isTran);
}
public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>> SaveQueues<T, T2, T3, T4, T5, T6>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2, T3, T4, T5, T6>(isTran);
}
public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>> SaveQueues<T, T2, T3, T4, T5>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2, T3, T4, T5>(isTran);
}
public Tuple<List<T>, List<T2>, List<T3>, List<T4>> SaveQueues<T, T2, T3, T4>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2, T3, T4>(isTran);
}
public Tuple<List<T>, List<T2>, List<T3>> SaveQueues<T, T2, T3>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2, T3>(isTran);
}
public Tuple<List<T>, List<T2>> SaveQueues<T, T2>(bool isTran = true)
{
return this.Context.SaveQueues<T, T2>(isTran);
}
public List<T> SaveQueues<T>(bool isTran = true)
{
return this.Context.SaveQueues<T>(isTran);
}
public Task<int> SaveQueuesAsync(bool isTran = true)
{
return this.Context.SaveQueuesAsync(isTran);
}
public Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>, List<T7>>> SaveQueuesAsync<T, T2, T3, T4, T5, T6, T7>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2, T3, T4, T5, T6, T7>(isTran);
}
public Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>>> SaveQueuesAsync<T, T2, T3, T4, T5, T6>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2, T3, T4, T5, T6>(isTran);
}
public Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>>> SaveQueuesAsync<T, T2, T3, T4, T5>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2, T3, T4, T5>(isTran);
}
public Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>>> SaveQueuesAsync<T, T2, T3, T4>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2, T3, T4>(isTran);
}
public Task<Tuple<List<T>, List<T2>, List<T3>>> SaveQueuesAsync<T, T2, T3>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2, T3>(isTran);
}
public Task<Tuple<List<T>, List<T2>>> SaveQueuesAsync<T, T2>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T, T2>(isTran);
}
public Task<List<T>> SaveQueuesAsync<T>(bool isTran = true)
{
return this.Context.SaveQueuesAsync<T>(isTran);
}
#endregion
#region Updateable
public IUpdateable<T> Updateable<T>() where T : class, new()
{
return this.Context.Updateable<T>();
}
public IUpdateable<T> Updateable<T>(Dictionary<string, object> columnDictionary) where T : class, new()
{
return this.Context.Updateable<T>(columnDictionary);
}
public IUpdateable<T> Updateable<T>(dynamic updateDynamicObject) where T : class, new()
{
return this.Context.Updateable<T>(updateDynamicObject);
}
public IUpdateable<T> Updateable<T>(Expression<Func<T, bool>> columns) where T : class, new()
{
return this.Context.Updateable<T>(columns);
}
public IUpdateable<T> Updateable<T>(Expression<Func<T, T>> columns) where T : class, new()
{
return this.Context.Updateable<T>(columns);
}
public IUpdateable<T> Updateable<T>(List<T> UpdateObjs) where T : class, new()
{
return this.Context.Updateable<T>(UpdateObjs);
}
public IUpdateable<T> Updateable<T>(T UpdateObj) where T : class, new()
{
return this.Context.Updateable<T>(UpdateObj);
}
public IUpdateable<T> Updateable<T>(T[] UpdateObjs) where T : class, new()
{
return this.Context.Updateable<T>(UpdateObjs);
}
#endregion
#region Ado
public IAdo Ado => this.Context.Ado;
#endregion
#region Deleteable
public IDeleteable<T> Deleteable<T>() where T : class, new()
{
return this.Context.Deleteable<T>();
}
public IDeleteable<T> Deleteable<T>(dynamic primaryKeyValue) where T : class, new()
{
return this.Context.Deleteable<T>(primaryKeyValue);
}
public IDeleteable<T> Deleteable<T>(dynamic[] primaryKeyValues) where T : class, new()
{
return this.Context.Deleteable<T>(primaryKeyValues);
}
public IDeleteable<T> Deleteable<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
return this.Context.Deleteable(expression);
}
public IDeleteable<T> Deleteable<T>(List<dynamic> pkValue) where T : class, new()
{
return this.Context.Deleteable<T>(pkValue);
}
public IDeleteable<T> Deleteable<T>(List<T> deleteObjs) where T : class, new()
{
return this.Context.Deleteable<T>(deleteObjs);
}
public IDeleteable<T> Deleteable<T>(T deleteObj) where T : class, new()
{
return this.Context.Deleteable<T>(deleteObj);
}
#endregion
#region More api
public IContextMethods Utilities { get { return this.Context.Utilities; } set { this.Context.Utilities = value; } }
public AopProvider Aop => this.Context.Aop;
public ICodeFirst CodeFirst => this.Context.CodeFirst;
public IDbFirst DbFirst => this.Context.DbFirst;
public IDbMaintenance DbMaintenance => this.Context.DbMaintenance;
public EntityMaintenance EntityMaintenance { get { return this.Context.EntityMaintenance; } set { this.Context.EntityMaintenance = value; } }
public QueryFilterProvider QueryFilter { get { return this.Context.QueryFilter; }set { this.Context.QueryFilter = value; } }
#endregion
#region TenantManager
public void ChangeDatabase(string configId)
{
Check.Exception(!_AllClients.Any(it => it.ConnectionConfig.ConfigId == configId), "ConfigId was not found {0}", configId);
InitTenant(_AllClients.First(it => it.ConnectionConfig.ConfigId == configId));
if (this._IsAllTran)
this.Ado.BeginTran();
if (this._IsOpen)
this.Open();
}
public void ChangeDatabase(Func<ConnectionConfig, bool> changeExpression)
{
var allConfigs = _AllClients.Select(it => it.ConnectionConfig);
Check.Exception(!allConfigs.Any(changeExpression), "changeExpression was not found {0}", changeExpression.ToString());
InitTenant(_AllClients.First(it => it.ConnectionConfig == allConfigs.First(changeExpression)));
if (this._IsAllTran)
this.Ado.BeginTran();
if (this._IsOpen)
this.Open();
}
public void BeginTran()
{
_IsAllTran = true;
this.Context.Ado.BeginTran();
}
public void CommitTran()
{
this.Context.Ado.CommitTran();
AllClientEach(it => it.Ado.CommitTran());
_IsAllTran = false;
}
public DbResult<bool> UseTran(Action action, Action<Exception> errorCallBack = null)
{
var result = new DbResult<bool>();
try
{
this.BeginTran();
if (action != null)
action();
this.CommitTran();
result.Data = result.IsSuccess = true;
}
catch (Exception ex)
{
result.ErrorException = ex;
result.ErrorMessage = ex.Message;
result.IsSuccess = false;
this.RollbackTran();
if (errorCallBack != null)
{
errorCallBack(ex);
}
}
return result;
}
public Task<DbResult<bool>> UseTranAsync(Action action, Action<Exception> errorCallBack = null)
{
return Task.FromResult(UseTran(action, errorCallBack));
}
public DbResult<T> UseTran<T>(Func<T> action, Action<Exception> errorCallBack = null)
{
var result = new DbResult<T>();
try
{
this.BeginTran();
if (action != null)
result.Data = action();
this.CommitTran();
result.IsSuccess = true;
}
catch (Exception ex)
{
result.ErrorException = ex;
result.ErrorMessage = ex.Message;
result.IsSuccess = false;
this.RollbackTran();
if (errorCallBack != null)
{
errorCallBack(ex);
}
}
return result;
}
public Task<DbResult<T>> UseTranAsync<T>(Func<T> action, Action<Exception> errorCallBack = null)
{
return Task.FromResult(UseTran(action, errorCallBack));
}
public void RollbackTran()
{
this.Context.Ado.RollbackTran();
AllClientEach(it => it.Ado.RollbackTran());
_IsAllTran = false;
}
public void Close()
{
this.Context.Close();
AllClientEach(it => it.Close());
_IsOpen = false;
}
public void Open()
{
this.Context.Open();
_IsOpen = true;
}
#endregion
#region IDispose
public void Dispose()
{
this.Context.Dispose();
AllClientEach(it => it.Ado.RollbackTran());
}
#endregion
#region Other method
public DateTime GetDate()
{
return this.Context.GetDate();
}
public void InitMappingInfo(Type type)
{
this.Context.InitMappingInfo(type);
}
public void InitMappingInfo<T>()
{
this.Context.InitMappingInfo(typeof(T));
}
#endregion
#region Helper
private SqlSugarProvider GetContext()
{
SqlSugarProvider result = null;
if (IsSameThreadAndShard())
{
result = SameThreadAndShard();
}
else if (IsNoSameThreadAndShard())
{
result = NoSameThreadAndShard();
}
else if (IsSynchronization())
{
result = Synchronization();
}
else if (IsSingleInstanceAsync())
{
result = NoSameThreadAsync();
}
else if (IsAsync())
{
result = Synchronization();
}
else
{
IsSingleInstance = true;
result = NoSameThread();
}
if (result.Root == null)
{
result.Root = this;
}
return result;
}
private SqlSugarProvider NoSameThreadAsync()
{
var result = GetCallContext();
return result;
}
private SqlSugarProvider NoSameThread()
{
if (CallContext.ContextList.Value == null)
{
var context = CopyClient();
AddCallContext(context);
return context;
}
else
{
var result = GetCallContext();
if (result == null)
{
var copy = CopyClient();
AddCallContext(copy);
return copy;
}
else
{
return result;
}
}
}
private SqlSugarProvider Synchronization()
{
_Context.MappingColumns = _MappingColumns;
_Context.MappingTables = _MappingTables;
_Context.IgnoreColumns = _IgnoreColumns;
_Context.IgnoreInsertColumns = _IgnoreInsertColumns;
return _Context;
}
private SqlSugarProvider NoSameThreadAndShard()
{
if (CallContext.ContextList.Value.IsNullOrEmpty())
{
var copy = CopyClient();
AddCallContext(copy);
return copy;
}
else
{
var result = GetCallContext();
if (result == null)
{
var copy = CopyClient();
AddCallContext(copy);
return copy;
}
else
{
return result;
}
}
}
private SqlSugarProvider SameThreadAndShard()
{
if (CallContext.ContextList.Value.IsNullOrEmpty())
{
AddCallContext(_Context);
return _Context;
}
else
{
var result = GetCallContext();
if (result == null)
{
var copy = CopyClient();
AddCallContext(copy);
return copy;
}
else
{
return result;
}
}
}
private bool IsAsync()
{
return AsyncId != null;
}
private bool IsSingleInstanceAsync()
{
return IsSingleInstance == true && AsyncId != null;
}
private bool IsSynchronization()
{
return _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString();
}
private bool IsNoSameThreadAndShard()
{
return CurrentConnectionConfig.IsShardSameThread && _ThreadId != Thread.CurrentThread.ManagedThreadId.ToString();
}
private bool IsSameThreadAndShard()
{
return CurrentConnectionConfig.IsShardSameThread && _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString();
}
private SqlSugarProvider CopyClient()
{
var result = new SqlSugarProvider(this.CurrentConnectionConfig);
result.MappingColumns = _MappingColumns;
result.MappingTables = _MappingTables;
result.IgnoreColumns = _IgnoreColumns;
result.IgnoreInsertColumns = _IgnoreInsertColumns;
return result;
}
private void AddCallContext(SqlSugarProvider context)
{
CallContext.ContextList.Value = new List<SqlSugarProvider>();
CallContext.ContextList.Value.Add(context);
}
private SqlSugarProvider GetCallContext()
{
return CallContext.ContextList.Value.FirstOrDefault(it =>
it.CurrentConnectionConfig.DbType == _Context.CurrentConnectionConfig.DbType &&
it.CurrentConnectionConfig.ConnectionString == _Context.CurrentConnectionConfig.ConnectionString &&
it.CurrentConnectionConfig.InitKeyType == _Context.CurrentConnectionConfig.InitKeyType &&
it.CurrentConnectionConfig.IsAutoCloseConnection == _Context.CurrentConnectionConfig.IsAutoCloseConnection
);
}
private void InitContext(ConnectionConfig config)
{
var aopIsNull = config.AopEvents == null;
if (aopIsNull)
{
config.AopEvents = new AopEvents();
}
_Context = new SqlSugarProvider(config);
if (!aopIsNull)
_Context.Ado.IsEnableLogEvent = true;
this.CurrentConnectionConfig = config;
_ThreadId = Thread.CurrentThread.ManagedThreadId.ToString();
if (_MappingColumns == null)
this.MappingTables = new MappingTableList();
if (this.MappingColumns == null)
this.MappingColumns = new MappingColumnList();
if (this.IgnoreColumns == null)
this.IgnoreColumns = new IgnoreColumnList();
if (this.IgnoreInsertColumns == null)
this.IgnoreInsertColumns = new IgnoreColumnList();
}
private void InitConfigs(List<ConnectionConfig> configs)
{
foreach (var item in configs)
{
if (item.ConfigId == null)
{
item.ConfigId = Guid.NewGuid().ToString();
}
}
}
private void AllClientEach(Action<ISqlSugarClient> action)
{
if (_AllClients.HasValue())
{
foreach (var item in _AllClients.Where(it => it.Context.HasValue()))
{
action(item.Context);
}
}
}
private void InitTenant(SugarTenant Tenant)
{
if (Tenant.Context == null)
{
Tenant.Context = new SqlSugarProvider(Tenant.ConnectionConfig);
}
_Context = Tenant.Context;
this.CurrentConnectionConfig = Tenant.ConnectionConfig;
}
#endregion
#region Obsolete
[Obsolete("Use EntityMaintenance")]
public EntityMaintenance EntityProvider { get { return this.Context.EntityProvider; } set { this.Context.EntityProvider = value; } }
[Obsolete("Use Utilities")]
public IContextMethods RewritableMethods { get { return this.Context.RewritableMethods; } set { this.Context.RewritableMethods = value; } }
[Obsolete("Use GetSimpleClient")]
public SimpleClient SimpleClient { get { return this.Context.SimpleClient; } }
#endregion
}
}