- 增加 UnitOfWork 静态属性 DebugBeingUsed,用于生产环境监视正在使用中的事务;

This commit is contained in:
28810 2019-11-21 21:55:04 +08:00
parent 04107d3d24
commit 8c5d5ddedc
9 changed files with 55 additions and 10 deletions

View File

@ -160,8 +160,7 @@ namespace FreeSql
await DbContextExecCommandAsync(); await DbContextExecCommandAsync();
//删除没有保存的数据 //删除没有保存的数据
var propValEach = GetItemValue(item, prop) as IEnumerable; var propValEach = GetItemValue(item, prop) as IEnumerable;
await _db.Orm.Select<object>().AsType(tref.RefEntityType).WhereDynamic(propValEach, true) await _db.Orm.Delete<object>().AsType(tref.RefEntityType).WhereDynamic(propValEach, true).ExecuteAffrowsAsync();
.ToDelete().ExecuteAffrowsAsync();
} }
} }
finally finally

View File

@ -172,8 +172,7 @@ namespace FreeSql
DbContextExecCommand(); DbContextExecCommand();
//删除没有保存的数据 //删除没有保存的数据
var propValEach = GetItemValue(item, prop) as IEnumerable; var propValEach = GetItemValue(item, prop) as IEnumerable;
_db.Orm.Select<object>().AsType(tref.RefEntityType).WhereDynamic(propValEach, true) _db.Orm.Delete<object>().AsType(tref.RefEntityType).WhereDynamic(propValEach, true).ExecuteAffrows();
.ToDelete().ExecuteAffrows();
} }
} }
finally finally

View File

@ -110,6 +110,13 @@
清空状态数据 清空状态数据
</summary> </summary>
</member> </member>
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据 lambda 条件删除数据
</summary>
<param name="predicate"></param>
<returns></returns>
</member>
<member name="M:FreeSql.DbSet`1.Add(`0)"> <member name="M:FreeSql.DbSet`1.Add(`0)">
<summary> <summary>
添加 添加
@ -267,6 +274,18 @@
此工作单元内的实体变化跟踪 此工作单元内的实体变化跟踪
</summary> </summary>
</member> </member>
<member name="P:FreeSql.UnitOfWork.DebugBeingUsed">
<summary>
正在使用中的工作单元(调试)
</summary>
</member>
<member name="P:FreeSql.UnitOfWork.Id">
<summary>
开启事务后有值,是 UnitOfWork 的唯一标识<para></para>
格式yyyyMMdd_HHmmss_种子id<para></para>
例如20191121_214504_1
</summary>
</member>
<member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)"> <member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
<summary> <summary>
创建普通数据上下文档对象 创建普通数据上下文档对象

View File

@ -1,6 +1,7 @@
using SafeObjectPool; using SafeObjectPool;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Linq; using System.Linq;
@ -14,10 +15,23 @@ namespace FreeSql
public static readonly AsyncLocal<IUnitOfWork> Current = new AsyncLocal<IUnitOfWork>(); public static readonly AsyncLocal<IUnitOfWork> Current = new AsyncLocal<IUnitOfWork>();
#endif #endif
static int _seed;
/// <summary>
/// 正在使用中的工作单元(调试)
/// </summary>
public static ConcurrentDictionary<string, UnitOfWork> DebugBeingUsed { get; } = new ConcurrentDictionary<string, UnitOfWork>();
protected IFreeSql _fsql; protected IFreeSql _fsql;
protected Object<DbConnection> _conn; protected Object<DbConnection> _conn;
protected DbTransaction _tran; protected DbTransaction _tran;
/// <summary>
/// 开启事务后有值,是 UnitOfWork 的唯一标识<para></para>
/// 格式yyyyMMdd_HHmmss_种子id<para></para>
/// 例如20191121_214504_1
/// </summary>
public string Id { get; private set; }
public UnitOfWork(IFreeSql fsql) public UnitOfWork(IFreeSql fsql)
{ {
_fsql = fsql; _fsql = fsql;
@ -28,6 +42,9 @@ namespace FreeSql
void ReturnObject() void ReturnObject()
{ {
if (string.IsNullOrEmpty(this.Id) == false && DebugBeingUsed.TryRemove(this.Id, out var old))
this.Id = null;
_fsql.Ado.MasterPool.Return(_conn); _fsql.Ado.MasterPool.Return(_conn);
_tran = null; _tran = null;
_conn = null; _conn = null;
@ -66,6 +83,9 @@ namespace FreeSql
_tran = IsolationLevel == null ? _tran = IsolationLevel == null ?
_conn.Value.BeginTransaction() : _conn.Value.BeginTransaction() :
_conn.Value.BeginTransaction(IsolationLevel.Value); _conn.Value.BeginTransaction(IsolationLevel.Value);
this.Id = $"{DateTime.Now.ToString("yyyyMMdd_HHmmss")}_{Interlocked.Increment(ref _seed)}";
DebugBeingUsed.TryAdd(this.Id, this);
} }
catch catch
{ {

View File

@ -655,11 +655,12 @@
<param name="items">实体集合</param> <param name="items">实体集合</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IDelete`1.WhereDynamic(System.Object)"> <member name="M:FreeSql.IDelete`1.WhereDynamic(System.Object,System.Boolean)">
<summary> <summary>
传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary> </summary>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<param name="not">是否标识为NOT</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IDelete`1.DisableGlobalFilter(System.String[])"> <member name="M:FreeSql.IDelete`1.DisableGlobalFilter(System.String[])">
@ -1797,11 +1798,12 @@
<param name="items">实体集合</param> <param name="items">实体集合</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IUpdate`1.WhereDynamic(System.Object)"> <member name="M:FreeSql.IUpdate`1.WhereDynamic(System.Object,System.Boolean)">
<summary> <summary>
传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary> </summary>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<param name="not">是否标识为NOT</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IUpdate`1.DisableGlobalFilter(System.String[])"> <member name="M:FreeSql.IUpdate`1.DisableGlobalFilter(System.String[])">

View File

@ -52,8 +52,9 @@ namespace FreeSql
/// 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} /// 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
/// </summary> /// </summary>
/// <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> /// <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
/// <param name="not">是否标识为NOT</param>
/// <returns></returns> /// <returns></returns>
IDelete<T1> WhereDynamic(object dywhere); IDelete<T1> WhereDynamic(object dywhere, bool not = false);
/// <summary> /// <summary>
/// 禁用全局过滤功能,不传参数时将禁用所有 /// 禁用全局过滤功能,不传参数时将禁用所有

View File

@ -121,8 +121,9 @@ namespace FreeSql
/// 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} /// 传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
/// </summary> /// </summary>
/// <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param> /// <param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
/// <param name="not">是否标识为NOT</param>
/// <returns></returns> /// <returns></returns>
IUpdate<T1> WhereDynamic(object dywhere); IUpdate<T1> WhereDynamic(object dywhere, bool not = false);
/// <summary> /// <summary>
/// 禁用全局过滤功能,不传参数时将禁用所有 /// 禁用全局过滤功能,不传参数时将禁用所有

View File

@ -96,7 +96,9 @@ namespace FreeSql.Internal.CommonProvider
} }
public IDelete<T1> Where(T1 item) => this.Where(new[] { item }); public IDelete<T1> Where(T1 item) => this.Where(new[] { item });
public IDelete<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table, "", items)); public IDelete<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table, "", items));
public IDelete<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere)); public IDelete<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
public IDelete<T1> DisableGlobalFilter(params string[] name) public IDelete<T1> DisableGlobalFilter(params string[] name)
{ {

View File

@ -434,7 +434,9 @@ namespace FreeSql.Internal.CommonProvider
} }
public IUpdate<T1> Where(T1 item) => this.Where(new[] { item }); public IUpdate<T1> Where(T1 item) => this.Where(new[] { item });
public IUpdate<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table, "", items)); public IUpdate<T1> Where(IEnumerable<T1> items) => this.Where(_commonUtils.WhereItems(_table, "", items));
public IUpdate<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere)); public IUpdate<T1> WhereDynamic(object dywhere, bool not = false) => not == false ?
this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
public IUpdate<T1> DisableGlobalFilter(params string[] name) public IUpdate<T1> DisableGlobalFilter(params string[] name)
{ {