diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index c8252ac2..f8446ff1 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.16 + 0.3.16.1 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository diff --git a/FreeSql.Repository/Repository/BaseRepository.cs b/FreeSql.Repository/Repository/BaseRepository.cs index 49d92a33..f6485d21 100644 --- a/FreeSql.Repository/Repository/BaseRepository.cs +++ b/FreeSql.Repository/Repository/BaseRepository.cs @@ -10,7 +10,7 @@ namespace FreeSql { where TEntity : class { protected IFreeSql _fsql; - internal DbTransaction _tran; + internal UnitOfWork _unitOfWork; public IDataFilter DataFilter { get; } = new DataFilter(); Func _asTableVal; @@ -94,14 +94,14 @@ namespace FreeSql { public Task UpdateAsync(TEntity entity) => OrmUpdate(entity).ExecuteAffrowsAsync(); protected ISelect OrmSelect(object dywhere) { - var select = _fsql.Select(dywhere).WithTransaction(_tran); + var select = _fsql.Select(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction()); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) select.Where(filter.Value.Expression); return select.AsTable(AsTableSelect); } protected IUpdate OrmUpdate(object dywhere) { var entityObj = dywhere as TEntity; - var update = _fsql.Update(dywhere).WithTransaction(_tran); + var update = _fsql.Update(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction()); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entityObj != null && filter.Value.ExpressionDelegate?.Invoke(entityObj) == false) @@ -111,14 +111,14 @@ namespace FreeSql { return update.AsTable(AsTable); } protected IDelete OrmDelete(object dywhere) { - var delete = _fsql.Delete(dywhere).WithTransaction(_tran); + var delete = _fsql.Delete(dywhere).WithTransaction(_unitOfWork?.GetOrBeginTransaction()); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) delete.Where(filter.Value.Expression); return delete.AsTable(AsTable); } protected IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected IInsert OrmInsert(IEnumerable entitys) { - var insert = _fsql.Insert(entitys).WithTransaction(_tran); + var insert = _fsql.Insert(entitys).WithTransaction(_unitOfWork?.GetOrBeginTransaction()); var filters = (DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { foreach (var entity in entitys) diff --git a/FreeSql.Repository/UnitOfWork/UnitOfWork.cs b/FreeSql.Repository/UnitOfWork/UnitOfWork.cs index 0bca9986..720ee77e 100644 --- a/FreeSql.Repository/UnitOfWork/UnitOfWork.cs +++ b/FreeSql.Repository/UnitOfWork/UnitOfWork.cs @@ -18,35 +18,45 @@ namespace FreeSql { _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(); try { _tran = _conn.Value.BeginTransaction(); } catch { - _fsql.Ado.MasterPool.Return(_conn); - _conn = null; + ReturnObject(); throw; } return _tran; } public void Commit() { - _isCommitOrRoolback = true; - if (_conn != null) { + if (_tran != null) { try { _tran.Commit(); + _isCommitOrRoolback = true; } finally { - _fsql.Ado.MasterPool.Return(_conn); + ReturnObject(); } } } public void Rollback() { _isCommitOrRoolback = true; - if (_conn != null) { + if (_tran != null) { try { _tran.Rollback(); + _isCommitOrRoolback = true; } finally { - _fsql.Ado.MasterPool.Return(_conn); + ReturnObject(); } } } @@ -58,12 +68,12 @@ namespace FreeSql { public DefaultRepository GetRepository(Expression> filter = null) where TEntity : class { var repos = new DefaultRepository(_fsql, filter); - repos._tran = BeginTransaction(); + repos._unitOfWork = this; return repos; } public GuidRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class { var repos = new GuidRepository(_fsql, filter, asTable); - repos._tran = BeginTransaction(); + repos._unitOfWork = this; return repos; } } diff --git a/FreeSql.Repository/Utils.cs b/FreeSql.Repository/Utils.cs index c7d3b32e..3e843872 100644 --- a/FreeSql.Repository/Utils.cs +++ b/FreeSql.Repository/Utils.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Text; namespace FreeSql { - + internal class Utils { internal static Action _globalDataFilter; diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index f38b1469..69e10a4f 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.3.16 + 0.3.16.1 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.