mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 UnitOfWork 静态属性 DebugBeingUsed,用于生产环境监视正在使用中的事务;
This commit is contained in:
parent
04107d3d24
commit
8c5d5ddedc
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
创建普通数据上下文档对象
|
创建普通数据上下文档对象
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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[])">
|
||||||
|
@ -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>
|
||||||
/// 禁用全局过滤功能,不传参数时将禁用所有
|
/// 禁用全局过滤功能,不传参数时将禁用所有
|
||||||
|
@ -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>
|
||||||
/// 禁用全局过滤功能,不传参数时将禁用所有
|
/// 禁用全局过滤功能,不传参数时将禁用所有
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user