加急修复 UnitOfWork 实现的 bug

This commit is contained in:
28810 2019-03-14 16:45:13 +08:00
parent 2ab59201b0
commit 89ff4ca44d
5 changed files with 28 additions and 18 deletions

View File

@ -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>

View File

@ -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)

View File

@ -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;
} }
} }

View File

@ -7,7 +7,7 @@ using System.Reflection;
using System.Text; using System.Text;
namespace FreeSql { namespace FreeSql {
internal class Utils { internal class Utils {
internal static Action<FluentDataFilter> _globalDataFilter; internal static Action<FluentDataFilter> _globalDataFilter;

View File

@ -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>