mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	## v0.3.22
- 优化 导航属性 ManyToOne 名称查找规则; - 增加 IFreeSql.Aop 属性,未来所有拦截方法都在这里,第一期支持如下: * 监控 ToList 返回的的数据,用于拦截重新装饰; * 监视 Where,包括 select/update/delete,返回值 true 时可使上层不被执行; * 可自定义解析表达式; - 增加 ISelect.TractToList,用于单次跟踪或审核实体; - 优化 FreeSql.DbContext SaveChanges;
This commit is contained in:
		@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
	<PropertyGroup>
 | 
			
		||||
		<TargetFramework>netstandard2.0</TargetFramework>
 | 
			
		||||
		<Version>0.3.21</Version>
 | 
			
		||||
		<Version>0.3.22</Version>
 | 
			
		||||
		<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
			
		||||
		<Authors>YeXiangQin</Authors>
 | 
			
		||||
		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,13 @@ namespace FreeSql {
 | 
			
		||||
		/// <returns></returns>
 | 
			
		||||
		TSelect WithTransaction(DbTransaction transaction);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 审核或跟踪 ToList 即将返回的数据
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// <param name="list"></param>
 | 
			
		||||
		/// <returns></returns>
 | 
			
		||||
		TSelect TrackToList(Action<object> action);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 执行SQL查询,返回 DataTable
 | 
			
		||||
		/// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,64 @@
 | 
			
		||||
//using FreeSql.DatabaseModel;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
using FreeSql.DatabaseModel;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
 | 
			
		||||
//namespace FreeSql {
 | 
			
		||||
//	public interface IAop {
 | 
			
		||||
namespace FreeSql {
 | 
			
		||||
	public interface IAop {
 | 
			
		||||
 | 
			
		||||
//		ISelect<T1> SelectFitler<T1>(ISelect<T1> select) where T1 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3> SelectFitler<T1, T2, T3>(ISelect<T1, T2, T3> select) where T1 : class where T2 : class where T3 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4> SelectFitler<T1, T2, T3, T4>(ISelect<T1, T2, T3, T4> select) where T1 : class where T2 : class where T3 : class where T4 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4, T5, T6> SelectFitler<T1, T2, T3, T4, T5, T6>(ISelect<T1, T2, T3, T4, T5, T6> select) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4, T5, T6, T7> SelectFitler<T1, T2, T3, T4, T5, T6, T7>(ISelect<T1, T2, T3, T4, T5, T6, T7> select) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4, T5, T6, T7, T8> SelectFitler<T1, T2, T3, T4, T5, T6, T7, T8>(ISelect<T1, T2, T3, T4, T5, T6, T7, T8> select) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> SelectFitler<T1, T2, T3, T4, T5, T6, T7, T8, T9>(ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> select) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class;
 | 
			
		||||
//		//ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> SelectFitler<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> select) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class;
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 监控 ToList 返回的的数据,用于拦截重新装饰
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		EventHandler<AopToListEventArgs> ToList { get; set; }
 | 
			
		||||
 | 
			
		||||
//		IUpdate<T1> UpdateFitler<T1>(IUpdate<T1> update) where T1 : class;
 | 
			
		||||
//		IDelete<T1> DeleteFitler<T1>(IUpdate<T1> delete) where T1 : class;
 | 
			
		||||
//	}
 | 
			
		||||
//}
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 监视 Where,包括 select/update/delete,可控制使上层不被执行。
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		EventHandler<AopWhereEventArgs> Where { get; set; }
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 可自定义解析表达式
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		EventHandler<AopParseExpressionEventArgs> ParseExpression { get; set; }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public class AopToListEventArgs : EventArgs {
 | 
			
		||||
		public AopToListEventArgs(object list) {
 | 
			
		||||
			this.List = list;
 | 
			
		||||
		}
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 可重新装饰的引用数据
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public object List { get; }
 | 
			
		||||
	}
 | 
			
		||||
	public class AopWhereEventArgs : EventArgs {
 | 
			
		||||
		public AopWhereEventArgs(params object[] parameters) {
 | 
			
		||||
			this.Parameters = parameters;
 | 
			
		||||
		}
 | 
			
		||||
		public object[] Parameters { get; }
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 可使上层不被执行这个条件
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public bool IsCancel { get; set; }
 | 
			
		||||
	}
 | 
			
		||||
	public class AopParseExpressionEventArgs : EventArgs {
 | 
			
		||||
		public AopParseExpressionEventArgs(Expression expression, Func<Expression, string> freeParse) {
 | 
			
		||||
			this.Expression = expression;
 | 
			
		||||
			this.FreeParse = freeParse;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 内置解析功能,可辅助您进行解析
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public Func<Expression, string> FreeParse { get; }
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 需要您解析的表达式
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public Expression Expression { get; }
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 解析后的内容
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		public string Result { get; set; }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -95,6 +95,10 @@ public interface IFreeSql {
 | 
			
		||||
	/// 数据库访问对象
 | 
			
		||||
	/// </summary>
 | 
			
		||||
	IAdo Ado { get; }
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// 所有拦截方法都在这里
 | 
			
		||||
	/// </summary>
 | 
			
		||||
	IAop Aop { get; }
 | 
			
		||||
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// CodeFirst 模式开发相关方法
 | 
			
		||||
 
 | 
			
		||||
@@ -227,8 +227,13 @@ namespace FreeSql.Internal {
 | 
			
		||||
		static ConcurrentDictionary<Type, MethodInfo> _dicExpressionLambdaToSqlAsSelectAnyMethodInfo = new ConcurrentDictionary<Type, MethodInfo>();
 | 
			
		||||
		static ConcurrentDictionary<Type, PropertyInfo> _dicNullableValueProperty = new ConcurrentDictionary<Type, PropertyInfo>();
 | 
			
		||||
		static ConcurrentDictionary<Type, Expression> _dicFreeSqlGlobalExtensionsAsSelectExpression = new ConcurrentDictionary<Type, Expression>();
 | 
			
		||||
		internal string ExpressionLambdaToSql(Expression exp, List<SelectTableInfo> _tables, List<SelectColumnInfo> _selectColumnMap, Func<Expression[], string> getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName) {
 | 
			
		||||
		internal string ExpressionLambdaToSql(Expression exp, List<SelectTableInfo> _tables, List<SelectColumnInfo> _selectColumnMap, Func<Expression[], string> getSelectGroupingMapString, SelectTableInfoType tbtype, bool isQuoteName, bool isDiyParse = true) {
 | 
			
		||||
			if (exp == null) return "";
 | 
			
		||||
			if (isDiyParse) {
 | 
			
		||||
				var args = new AopParseExpressionEventArgs(exp, ukexp => ExpressionLambdaToSql(exp, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName, false));
 | 
			
		||||
				_common._orm.Aop.ParseExpression?.Invoke(this, args);
 | 
			
		||||
				if (string.IsNullOrEmpty(args.Result) == false) return args.Result;
 | 
			
		||||
			}
 | 
			
		||||
			switch (exp.NodeType) {
 | 
			
		||||
				case ExpressionType.Not: return $"not({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName)})";
 | 
			
		||||
				case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, _tables, _selectColumnMap, getSelectGroupingMapString, tbtype, isQuoteName);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								FreeSql/Internal/CommonProvider/AopProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								FreeSql/Internal/CommonProvider/AopProvider.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
	class AopProvider : IAop {
 | 
			
		||||
		public EventHandler<AopToListEventArgs> ToList { get; set; }
 | 
			
		||||
		public EventHandler<AopWhereEventArgs> Where { get; set; }
 | 
			
		||||
		public EventHandler<AopParseExpressionEventArgs> ParseExpression { get; set; }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -51,6 +51,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public IDelete<T1> Where(Expression<Func<T1, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, null, exp?.Body, null));
 | 
			
		||||
		public IDelete<T1> Where(string sql, object parms = null) {
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this;
 | 
			
		||||
 | 
			
		||||
			if (++_whereTimes > 1) _where.Append(" AND ");
 | 
			
		||||
			_where.Append("(").Append(sql).Append(")");
 | 
			
		||||
			if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		protected CommonUtils _commonUtils;
 | 
			
		||||
		protected CommonExpression _commonExpression;
 | 
			
		||||
		protected DbTransaction _transaction;
 | 
			
		||||
		protected Action<object> _trackToList;
 | 
			
		||||
 | 
			
		||||
		internal static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms) {
 | 
			
		||||
			var toType = to?.GetType();
 | 
			
		||||
@@ -60,6 +61,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			//toType.GetField("_commonUtils", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonUtils);
 | 
			
		||||
			//toType.GetField("_commonExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonExpression);
 | 
			
		||||
			toType.GetField("_transaction", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._transaction);
 | 
			
		||||
			toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Select0Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) {
 | 
			
		||||
@@ -71,6 +73,11 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure<T1>();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public TSelect TrackToList(Action<object> track) {
 | 
			
		||||
			_trackToList = track;
 | 
			
		||||
			return this as TSelect;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public TSelect WithTransaction(DbTransaction transaction) {
 | 
			
		||||
			_transaction = transaction;
 | 
			
		||||
			return this as TSelect;
 | 
			
		||||
@@ -215,6 +222,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
			
		||||
					ret.Add((TTuple)read.Value);
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -230,6 +239,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					ret.Add((TTuple)read.Value);
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -243,6 +254,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
				_orm.Ado.ExecuteReader(_transaction, dr => {
 | 
			
		||||
					ret.Add(af.Read(dr));
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -257,6 +270,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					ret.Add(af.Read(dr));
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -283,6 +298,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					var index = -1;
 | 
			
		||||
					ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -298,6 +315,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -480,6 +499,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public TSelect Where(string sql, object parms = null) => this.WhereIf(true, sql, parms);
 | 
			
		||||
		public TSelect WhereIf(bool condition, string sql, object parms = null) {
 | 
			
		||||
			if (condition == false || string.IsNullOrEmpty(sql)) return this as TSelect;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this as TSelect;
 | 
			
		||||
 | 
			
		||||
			_where.Append(" AND (").Append(sql).Append(")");
 | 
			
		||||
			if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
			return this as TSelect;
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,5 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) });
 | 
			
		||||
			return method.Invoke(_select, new object[] { field.Length > 0 ? field.Remove(0, 2).ToString() : null }) as string;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -117,6 +117,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public IUpdate<T1> Where(Expression<Func<T1, bool>> expression) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, null, expression?.Body, null));
 | 
			
		||||
		public IUpdate<T1> Where(string sql, object parms = null) {
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this;
 | 
			
		||||
 | 
			
		||||
			_where.Append(" AND (").Append(sql).Append(")");
 | 
			
		||||
			if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
			return this;
 | 
			
		||||
 
 | 
			
		||||
@@ -494,7 +494,10 @@ namespace FreeSql.Internal {
 | 
			
		||||
						var findtbrefPkCsName = tbref.Primarys[a].CsName.TrimStart('_');
 | 
			
		||||
						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 //下划线命名
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_{findtbrefPkCsName}", out trycol) == false && //下划线命名
 | 
			
		||||
							tbref.Primarys.Length == 1 &&
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_Id", out trycol) == false &&
 | 
			
		||||
							trytb.ColumnsByCs.TryGetValue($"{pnv.Name}Id", out trycol) == false
 | 
			
		||||
							) {
 | 
			
		||||
							//一对一,主键与主键查找
 | 
			
		||||
							if (isOnoToOne) {
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ namespace FreeSql.MySql {
 | 
			
		||||
		public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new MySqlDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
			
		||||
 | 
			
		||||
		public IAdo Ado { get; }
 | 
			
		||||
		public IAop Aop { get; }
 | 
			
		||||
		public ICache Cache { get; }
 | 
			
		||||
		public ICodeFirst CodeFirst { get; }
 | 
			
		||||
		public IDbFirst DbFirst { get; }
 | 
			
		||||
@@ -44,6 +45,7 @@ namespace FreeSql.MySql {
 | 
			
		||||
 | 
			
		||||
			this.Cache = new CacheProvider(cache, log);
 | 
			
		||||
			this.Ado = new MySqlAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString);
 | 
			
		||||
			this.Aop = new AopProvider();
 | 
			
		||||
 | 
			
		||||
			this.DbFirst = new MySqlDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
			this.CodeFirst = new MySqlCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.Oracle {
 | 
			
		||||
		public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new OracleDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
			
		||||
 | 
			
		||||
		public IAdo Ado { get; }
 | 
			
		||||
		public IAop Aop { get; }
 | 
			
		||||
		public ICache Cache { get; }
 | 
			
		||||
		public ICodeFirst CodeFirst { get; }
 | 
			
		||||
		public IDbFirst DbFirst => null;
 | 
			
		||||
@@ -35,6 +36,7 @@ namespace FreeSql.Oracle {
 | 
			
		||||
 | 
			
		||||
			this.Cache = new CacheProvider(cache, log);
 | 
			
		||||
			this.Ado = new OracleAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString);
 | 
			
		||||
			this.Aop = new AopProvider();
 | 
			
		||||
 | 
			
		||||
			this.CodeFirst = new OracleCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,7 @@ namespace FreeSql.PostgreSQL {
 | 
			
		||||
		public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new PostgreSQLDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
			
		||||
 | 
			
		||||
		public IAdo Ado { get; }
 | 
			
		||||
		public IAop Aop { get; }
 | 
			
		||||
		public ICache Cache { get; }
 | 
			
		||||
		public ICodeFirst CodeFirst { get; }
 | 
			
		||||
		public IDbFirst DbFirst { get; }
 | 
			
		||||
@@ -71,6 +72,7 @@ namespace FreeSql.PostgreSQL {
 | 
			
		||||
 | 
			
		||||
			this.Cache = new CacheProvider(cache, log);
 | 
			
		||||
			this.Ado = new PostgreSQLAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString);
 | 
			
		||||
			this.Aop = new AopProvider();
 | 
			
		||||
 | 
			
		||||
			this.DbFirst = new PostgreSQLDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
			this.CodeFirst = new PostgreSQLCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ namespace FreeSql.SqlServer {
 | 
			
		||||
		public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new SqlServerDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
			
		||||
 | 
			
		||||
		public IAdo Ado { get; }
 | 
			
		||||
		public IAop Aop { get; }
 | 
			
		||||
		public ICache Cache { get; }
 | 
			
		||||
		public ICodeFirst CodeFirst { get; }
 | 
			
		||||
		public IDbFirst DbFirst { get; }
 | 
			
		||||
@@ -34,6 +35,7 @@ namespace FreeSql.SqlServer {
 | 
			
		||||
 | 
			
		||||
			this.Cache = new CacheProvider(cache, log);
 | 
			
		||||
			this.Ado = new SqlServerAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString);
 | 
			
		||||
			this.Aop = new AopProvider();
 | 
			
		||||
 | 
			
		||||
			this.DbFirst = new SqlServerDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
			this.CodeFirst = new SqlServerCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.Sqlite {
 | 
			
		||||
		public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new SqliteDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
			
		||||
 | 
			
		||||
		public IAdo Ado { get; }
 | 
			
		||||
		public IAop Aop { get; }
 | 
			
		||||
		public ICache Cache { get; }
 | 
			
		||||
		public ICodeFirst CodeFirst { get; }
 | 
			
		||||
		public IDbFirst DbFirst => null;
 | 
			
		||||
@@ -35,6 +36,7 @@ namespace FreeSql.Sqlite {
 | 
			
		||||
 | 
			
		||||
			this.Cache = new CacheProvider(cache, log);
 | 
			
		||||
			this.Ado = new SqliteAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString);
 | 
			
		||||
			this.Aop = new AopProvider();
 | 
			
		||||
 | 
			
		||||
			this.CodeFirst = new SqliteCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user