mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	加急修复 UnitOfWork 实现的 bug
This commit is contained in:
		@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	<PropertyGroup>
 | 
						<PropertyGroup>
 | 
				
			||||||
		<TargetFramework>netstandard2.0</TargetFramework>
 | 
							<TargetFramework>netstandard2.0</TargetFramework>
 | 
				
			||||||
		<Version>0.3.16</Version>
 | 
							<Version>0.3.16.1</Version>
 | 
				
			||||||
		<Authors>YeXiangQin</Authors>
 | 
							<Authors>YeXiangQin</Authors>
 | 
				
			||||||
		<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table.</Description>
 | 
							<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table.</Description>
 | 
				
			||||||
		<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl>
 | 
							<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ namespace FreeSql {
 | 
				
			|||||||
		where TEntity : class {
 | 
							where TEntity : class {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		protected IFreeSql _fsql;
 | 
							protected IFreeSql _fsql;
 | 
				
			||||||
		internal DbTransaction _tran;
 | 
							internal UnitOfWork _unitOfWork;
 | 
				
			||||||
		public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>();
 | 
							public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Func<string, string> _asTableVal;
 | 
							Func<string, string> _asTableVal;
 | 
				
			||||||
@@ -94,14 +94,14 @@ namespace FreeSql {
 | 
				
			|||||||
		public Task<int> UpdateAsync(TEntity entity) => OrmUpdate(entity).ExecuteAffrowsAsync();
 | 
							public Task<int> UpdateAsync(TEntity entity) => OrmUpdate(entity).ExecuteAffrowsAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		protected ISelect<TEntity> OrmSelect(object dywhere) {
 | 
							protected ISelect<TEntity> OrmSelect(object dywhere) {
 | 
				
			||||||
			var select = _fsql.Select<TEntity>(dywhere).WithTransaction(_tran);
 | 
								var select = _fsql.Select<TEntity>(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction());
 | 
				
			||||||
			var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
								var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
				
			||||||
			foreach (var filter in filters) select.Where(filter.Value.Expression);
 | 
								foreach (var filter in filters) select.Where(filter.Value.Expression);
 | 
				
			||||||
			return select.AsTable(AsTableSelect);
 | 
								return select.AsTable(AsTableSelect);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		protected IUpdate<TEntity> OrmUpdate(object dywhere) {
 | 
							protected IUpdate<TEntity> OrmUpdate(object dywhere) {
 | 
				
			||||||
			var entityObj = dywhere as TEntity;
 | 
								var entityObj = dywhere as TEntity;
 | 
				
			||||||
			var update = _fsql.Update<TEntity>(dywhere).WithTransaction(_tran);
 | 
								var update = _fsql.Update<TEntity>(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction());
 | 
				
			||||||
			var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
								var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
				
			||||||
			foreach (var filter in filters) {
 | 
								foreach (var filter in filters) {
 | 
				
			||||||
				if (entityObj != null && filter.Value.ExpressionDelegate?.Invoke(entityObj) == false)
 | 
									if (entityObj != null && filter.Value.ExpressionDelegate?.Invoke(entityObj) == false)
 | 
				
			||||||
@@ -111,14 +111,14 @@ namespace FreeSql {
 | 
				
			|||||||
			return update.AsTable(AsTable);
 | 
								return update.AsTable(AsTable);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		protected IDelete<TEntity> OrmDelete(object dywhere) {
 | 
							protected IDelete<TEntity> OrmDelete(object dywhere) {
 | 
				
			||||||
			var delete = _fsql.Delete<TEntity>(dywhere).WithTransaction(_tran);
 | 
								var delete = _fsql.Delete<TEntity>(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction());
 | 
				
			||||||
			var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
								var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
				
			||||||
			foreach (var filter in filters) delete.Where(filter.Value.Expression);
 | 
								foreach (var filter in filters) delete.Where(filter.Value.Expression);
 | 
				
			||||||
			return delete.AsTable(AsTable);
 | 
								return delete.AsTable(AsTable);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		protected IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity });
 | 
							protected IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity });
 | 
				
			||||||
		protected IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys) {
 | 
							protected IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys) {
 | 
				
			||||||
			var insert = _fsql.Insert<TEntity>(entitys).WithTransaction(_tran);
 | 
								var insert = _fsql.Insert<TEntity>(entitys).WithTransaction(_unitOfWork?.GetOrBeginTransaction());
 | 
				
			||||||
			var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
								var filters = (DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
 | 
				
			||||||
			foreach (var filter in filters) {
 | 
								foreach (var filter in filters) {
 | 
				
			||||||
				foreach (var entity in entitys)
 | 
									foreach (var entity in entitys)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,35 +18,45 @@ namespace FreeSql {
 | 
				
			|||||||
			_fsql = fsql;
 | 
								_fsql = fsql;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DbTransaction BeginTransaction() {
 | 
							void ReturnObject() {
 | 
				
			||||||
 | 
								_fsql.Ado.MasterPool.Return(_conn);
 | 
				
			||||||
 | 
								_tran = null;
 | 
				
			||||||
 | 
								_conn = null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							internal DbTransaction GetOrBeginTransaction() {
 | 
				
			||||||
 | 
								_isCommitOrRoolback = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (_tran != null) return _tran;
 | 
				
			||||||
 | 
								if (_conn != null) _fsql.Ado.MasterPool.Return(_conn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_conn = _fsql.Ado.MasterPool.Get();
 | 
								_conn = _fsql.Ado.MasterPool.Get();
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				_tran = _conn.Value.BeginTransaction();
 | 
									_tran = _conn.Value.BeginTransaction();
 | 
				
			||||||
			} catch {
 | 
								} catch {
 | 
				
			||||||
				_fsql.Ado.MasterPool.Return(_conn);
 | 
									ReturnObject();
 | 
				
			||||||
				_conn = null;
 | 
					 | 
				
			||||||
				throw;
 | 
									throw;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return _tran;
 | 
								return _tran;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public void Commit() {
 | 
							public void Commit() {
 | 
				
			||||||
			_isCommitOrRoolback = true;
 | 
								if (_tran != null) {
 | 
				
			||||||
			if (_conn != null) {
 | 
					 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					_tran.Commit();
 | 
										_tran.Commit();
 | 
				
			||||||
 | 
										_isCommitOrRoolback = true;
 | 
				
			||||||
				} finally {
 | 
									} finally {
 | 
				
			||||||
					_fsql.Ado.MasterPool.Return(_conn);
 | 
										ReturnObject();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public void Rollback() {
 | 
							public void Rollback() {
 | 
				
			||||||
			_isCommitOrRoolback = true;
 | 
								_isCommitOrRoolback = true;
 | 
				
			||||||
			if (_conn != null) {
 | 
								if (_tran != null) {
 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					_tran.Rollback();
 | 
										_tran.Rollback();
 | 
				
			||||||
 | 
										_isCommitOrRoolback = true;
 | 
				
			||||||
				} finally {
 | 
									} finally {
 | 
				
			||||||
					_fsql.Ado.MasterPool.Return(_conn);
 | 
										ReturnObject();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -58,12 +68,12 @@ namespace FreeSql {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		public DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
 | 
							public DefaultRepository<TEntity, TKey> GetRepository<TEntity, TKey>(Expression<Func<TEntity, bool>> filter = null) where TEntity : class {
 | 
				
			||||||
			var repos = new DefaultRepository<TEntity, TKey>(_fsql, filter);
 | 
								var repos = new DefaultRepository<TEntity, TKey>(_fsql, filter);
 | 
				
			||||||
			repos._tran = BeginTransaction();
 | 
								repos._unitOfWork = this;
 | 
				
			||||||
			return repos;
 | 
								return repos;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public GuidRepository<TEntity> GetGuidRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class {
 | 
							public GuidRepository<TEntity> GetGuidRepository<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<string, string> asTable = null) where TEntity : class {
 | 
				
			||||||
			var repos = new GuidRepository<TEntity>(_fsql, filter, asTable);
 | 
								var repos = new GuidRepository<TEntity>(_fsql, filter, asTable);
 | 
				
			||||||
			repos._tran = BeginTransaction();
 | 
								repos._unitOfWork = this;
 | 
				
			||||||
			return repos;
 | 
								return repos;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	<PropertyGroup>
 | 
						<PropertyGroup>
 | 
				
			||||||
		<TargetFramework>netstandard2.0</TargetFramework>
 | 
							<TargetFramework>netstandard2.0</TargetFramework>
 | 
				
			||||||
		<Version>0.3.16</Version>
 | 
							<Version>0.3.16.1</Version>
 | 
				
			||||||
		<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
							<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
				
			||||||
		<Authors>YeXiangQin</Authors>
 | 
							<Authors>YeXiangQin</Authors>
 | 
				
			||||||
		<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
 | 
							<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user