mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	IFreeSql 增加 IDisposable
This commit is contained in:
		@@ -4,7 +4,7 @@ using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
public interface IFreeSql<TMark> : IFreeSql { }
 | 
			
		||||
 | 
			
		||||
public interface IFreeSql {
 | 
			
		||||
public interface IFreeSql : IDisposable {
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// 插入数据
 | 
			
		||||
	/// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ using System.Text;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
	abstract partial class AdoProvider : IAdo {
 | 
			
		||||
	abstract partial class AdoProvider : IAdo, IDisposable {
 | 
			
		||||
 | 
			
		||||
		protected abstract void ReturnConnection(ObjectPool<DbConnection> pool, Object<DbConnection> conn, Exception ex);
 | 
			
		||||
		protected abstract DbCommand CreateCommand();
 | 
			
		||||
 
 | 
			
		||||
@@ -110,13 +110,6 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public void CommitTransaction() => CommitTransaction(true);
 | 
			
		||||
		public void RollbackTransaction() => CommitTransaction(false);
 | 
			
		||||
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			Transaction2[] trans = null;
 | 
			
		||||
			lock (_trans_lock)
 | 
			
		||||
				trans = _trans.Values.ToArray();
 | 
			
		||||
			foreach (Transaction2 tran in trans) CommitTransaction(false, tran);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler) {
 | 
			
		||||
			Transaction(handler, TimeSpan.FromSeconds(60));
 | 
			
		||||
		}
 | 
			
		||||
@@ -130,5 +123,35 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
				throw ex;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		~AdoProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			try {
 | 
			
		||||
				Transaction2[] trans = null;
 | 
			
		||||
				lock (_trans_lock)
 | 
			
		||||
					trans = _trans.Values.ToArray();
 | 
			
		||||
				foreach (Transaction2 tran in trans) CommitTransaction(false, tran);
 | 
			
		||||
			} catch { }
 | 
			
		||||
 | 
			
		||||
			ObjectPool<DbConnection>[] pools = null;
 | 
			
		||||
			for (var a = 0; a < 10; a++) {
 | 
			
		||||
				try {
 | 
			
		||||
					pools = SlavePools.ToArray();
 | 
			
		||||
					SlavePools.Clear();
 | 
			
		||||
					break;
 | 
			
		||||
				} catch {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if (pools != null) {
 | 
			
		||||
				foreach (var pool in pools) {
 | 
			
		||||
					try { pool.Dispose(); } catch { }
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			try { MasterPool.Dispose(); } catch { }
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -9,7 +9,7 @@ using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
	class CacheProvider : ICache {
 | 
			
		||||
	class CacheProvider : ICache, IDisposable {
 | 
			
		||||
 | 
			
		||||
		public IDistributedCache Cache { get; private set; }
 | 
			
		||||
		private bool CacheSupportMultiRemove = false;
 | 
			
		||||
@@ -30,6 +30,16 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		~CacheProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
 | 
			
		||||
			Cache = null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Func<object, string> Serialize { get; set; }
 | 
			
		||||
		public Func<string, Type, object> Deserialize { get; set; }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -542,7 +542,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
						if (findtbrefPkCsName.StartsWith(tbref.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(tbref.Type.Name.Length).TrimStart('_');
 | 
			
		||||
						if (trytb.ColumnsByCs.TryGetValue($"{pnv.Name}{findtbrefPkCsName}", out var trycol) == false && //骆峰命名
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_{findtbrefPkCsName}", out trycol) == false && //下划线命名
 | 
			
		||||
							tbref.Primarys.Length == 1 &&
 | 
			
		||||
							//tbref.Primarys.Length == 1 &&
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_Id", out trycol) == false &&
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}Id", out trycol) == false
 | 
			
		||||
							) {
 | 
			
		||||
@@ -569,13 +569,14 @@ namespace FreeSql.Internal {
 | 
			
		||||
								if (isLazy) throw nvref.Exception;
 | 
			
		||||
								continue;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						if (trycol == null) {
 | 
			
		||||
							nvref.Exception = new Exception($"导航属性 {trytbTypeName}.{pnv.Name} 没有找到对应的字段,如:{pnv.Name}{findtbrefPkCsName}、{pnv.Name}_{findtbrefPkCsName}");
 | 
			
		||||
							trytb.AddOrUpdateTableRef(pnv.Name, nvref);
 | 
			
		||||
							if (isLazy) throw nvref.Exception;
 | 
			
		||||
							continue;
 | 
			
		||||
						}
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						nvref.Columns.Add(trycol);
 | 
			
		||||
						nvref.RefColumns.Add(tbref.Primarys[a]);
 | 
			
		||||
 
 | 
			
		||||
@@ -57,5 +57,15 @@ namespace FreeSql.MySql {
 | 
			
		||||
		public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
 | 
			
		||||
 | 
			
		||||
		~MySqlProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			(this.Ado as AdoProvider).Dispose();
 | 
			
		||||
			(this.Cache as CacheProvider)?.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -48,5 +48,15 @@ namespace FreeSql.Oracle {
 | 
			
		||||
		public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
 | 
			
		||||
 | 
			
		||||
		~OracleProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			(this.Ado as AdoProvider).Dispose();
 | 
			
		||||
			(this.Cache as CacheProvider)?.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -84,5 +84,15 @@ namespace FreeSql.PostgreSQL {
 | 
			
		||||
		public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
 | 
			
		||||
 | 
			
		||||
		~PostgreSQLProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			(this.Ado as AdoProvider).Dispose();
 | 
			
		||||
			(this.Cache as CacheProvider)?.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,5 +55,15 @@ namespace FreeSql.SqlServer {
 | 
			
		||||
		public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
 | 
			
		||||
 | 
			
		||||
		~SqlServerProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			(this.Ado as AdoProvider).Dispose();
 | 
			
		||||
			(this.Cache as CacheProvider)?.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,5 +47,15 @@ namespace FreeSql.Sqlite {
 | 
			
		||||
		public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
			
		||||
 | 
			
		||||
		public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
 | 
			
		||||
 | 
			
		||||
		~SqliteProvider() {
 | 
			
		||||
			this.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
		bool _isdisposed = false;
 | 
			
		||||
		public void Dispose() {
 | 
			
		||||
			if (_isdisposed) return;
 | 
			
		||||
			(this.Ado as AdoProvider).Dispose();
 | 
			
		||||
			(this.Cache as CacheProvider)?.Dispose();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user