- 调整 DbContext.EntityChangeInfo 类名为 DbContext.EntityChangeReport.ChangeInfo;

- 调整 IUnitOfWork 接口,移除 OnEntityChange 属性,增加 EntityChangeReport 属性;
This commit is contained in:
28810 2019-10-15 19:18:31 +08:00
parent 375ba5f3cb
commit d7877924a5
9 changed files with 60 additions and 50 deletions

View File

@ -46,9 +46,9 @@ namespace FreeSql
return _optionsPriv; return _optionsPriv;
} }
} }
internal void EmitOnEntityChange(List<DbContext.EntityChangeInfo> report) internal void EmitOnEntityChange(List<EntityChangeReport.ChangeInfo> report)
{ {
var oec = UnitOfWork?.OnEntityChange ?? Options.OnEntityChange; var oec = UnitOfWork?.EntityChangeReport?.OnChange ?? Options.OnEntityChange;
if (oec == null || report == null || report.Any() == false) return; if (oec == null || report == null || report.Any() == false) return;
oec(report); oec(report);
} }
@ -155,12 +155,23 @@ namespace FreeSql
#endregion #endregion
#region Queue Action #region Queue Action
internal List<EntityChangeInfo> _entityChangeReport = new List<EntityChangeInfo>(); public class EntityChangeReport
public class EntityChangeInfo {
public class ChangeInfo
{ {
public object Object { get; set; } public object Object { get; set; }
public EntityChangeType Type { get; set; } public EntityChangeType Type { get; set; }
} }
/// <summary>
/// 实体变化记录
/// </summary>
public List<ChangeInfo> Report { get; } = new List<ChangeInfo>();
/// <summary>
/// 实体变化事件
/// </summary>
public Action<List<ChangeInfo>> OnChange { get; set; }
}
internal List<EntityChangeReport.ChangeInfo> _entityChangeReport = new List<EntityChangeReport.ChangeInfo>();
public enum EntityChangeType { Insert, Update, Delete, SqlRaw } public enum EntityChangeType { Insert, Update, Delete, SqlRaw }
internal class ExecCommandInfo internal class ExecCommandInfo
{ {

View File

@ -25,6 +25,6 @@ namespace FreeSql
/// <summary> /// <summary>
/// 实体变化事件 /// 实体变化事件
/// </summary> /// </summary>
public Action<List<DbContext.EntityChangeInfo>> OnEntityChange { get; set; } public Action<List<DbContext.EntityChangeReport.ChangeInfo>> OnEntityChange { get; set; }
} }
} }

View File

@ -23,7 +23,7 @@ namespace FreeSql
{ {
if (adds.Any() == false) return 0; if (adds.Any() == false) return 0;
var affrows = await this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrowsAsync(); var affrows = await this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrowsAsync();
_db._entityChangeReport.AddRange(adds.Select(a => new DbContext.EntityChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Insert })); _db._entityChangeReport.AddRange(adds.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Insert }));
return affrows; return affrows;
} }
@ -46,7 +46,7 @@ namespace FreeSql
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
IncrAffrows(1); IncrAffrows(1);
_db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data); Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList) if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true); await AddOrUpdateNavigateListAsync(data, true);
@ -55,7 +55,7 @@ namespace FreeSql
{ {
await DbContextExecCommandAsync(); await DbContextExecCommandAsync();
var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First(); var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
IncrAffrows(1); IncrAffrows(1);
_db.Orm.MapEntityValue(_entityType, newval, data); _db.Orm.MapEntityValue(_entityType, newval, data);
Attach(newval); Attach(newval);
@ -70,7 +70,7 @@ namespace FreeSql
var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); var idtval = await this.OrmInsert(data).ExecuteIdentityAsync();
IncrAffrows(1); IncrAffrows(1);
_db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data); Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList) if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true); await AddOrUpdateNavigateListAsync(data, true);
@ -104,7 +104,7 @@ namespace FreeSql
await DbContextExecCommandAsync(); await DbContextExecCommandAsync();
var rets = await this.OrmInsert(data).ExecuteInsertedAsync(); var rets = await this.OrmInsert(data).ExecuteInsertedAsync();
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配"); if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配");
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert })); _db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
var idx = 0; var idx = 0;
foreach (var s in data) foreach (var s in data)
_db.Orm.MapEntityValue(_entityType, rets[idx++], s); _db.Orm.MapEntityValue(_entityType, rets[idx++], s);
@ -200,7 +200,7 @@ namespace FreeSql
foreach (var midWhere in midWheres) delall.Where(midWhere); foreach (var midWhere in midWheres) delall.Where(midWhere);
var sql = delall.ToSql(); var sql = delall.ToSql();
await delall.ExecuteAffrowsAsync(); await delall.ExecuteAffrowsAsync();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw });
} }
else //保存 else //保存
{ {
@ -321,7 +321,7 @@ namespace FreeSql
var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig); var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig);
var affrows = await update.ExecuteAffrowsAsync(); var affrows = await update.ExecuteAffrowsAsync();
_db._entityChangeReport.AddRange(updateSource.Select(a => new DbContext.EntityChangeInfo { Object = a, Type = DbContext.EntityChangeType.Update })); _db._entityChangeReport.AddRange(updateSource.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Update }));
foreach (var newval in data) foreach (var newval in data)
{ {
@ -373,7 +373,7 @@ namespace FreeSql
{ {
if (dels.Any() == false) return 0; if (dels.Any() == false) return 0;
var affrows = await this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrowsAsync(); var affrows = await this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrowsAsync();
_db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Delete })); _db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Delete }));
return Math.Max(dels.Length, affrows); return Math.Max(dels.Length, affrows);
} }
#endregion #endregion

View File

@ -23,7 +23,7 @@ namespace FreeSql
{ {
if (adds.Any() == false) return 0; if (adds.Any() == false) return 0;
var affrows = this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrows(); var affrows = this.OrmInsert(adds.Select(a => a.Value)).ExecuteAffrows();
_db._entityChangeReport.AddRange(adds.Select(a => new DbContext.EntityChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Insert })); _db._entityChangeReport.AddRange(adds.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Insert }));
return affrows; return affrows;
} }
@ -46,7 +46,7 @@ namespace FreeSql
var idtval = this.OrmInsert(data).ExecuteIdentity(); var idtval = this.OrmInsert(data).ExecuteIdentity();
IncrAffrows(1); IncrAffrows(1);
_db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data); Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList) if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true); AddOrUpdateNavigateList(data, true);
@ -55,7 +55,7 @@ namespace FreeSql
{ {
DbContextExecCommand(); DbContextExecCommand();
var newval = this.OrmInsert(data).ExecuteInserted().First(); var newval = this.OrmInsert(data).ExecuteInserted().First();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
IncrAffrows(1); IncrAffrows(1);
_db.Orm.MapEntityValue(_entityType, newval, data); _db.Orm.MapEntityValue(_entityType, newval, data);
Attach(newval); Attach(newval);
@ -70,7 +70,7 @@ namespace FreeSql
var idtval = this.OrmInsert(data).ExecuteIdentity(); var idtval = this.OrmInsert(data).ExecuteIdentity();
IncrAffrows(1); IncrAffrows(1);
_db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data); Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList) if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true); AddOrUpdateNavigateList(data, true);
@ -108,7 +108,7 @@ namespace FreeSql
DbContextExecCommand(); DbContextExecCommand();
var rets = this.OrmInsert(data).ExecuteInserted(); var rets = this.OrmInsert(data).ExecuteInserted();
if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配"); if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配");
_db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert })); _db._entityChangeReport.AddRange(rets.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Insert }));
var idx = 0; var idx = 0;
foreach (var s in data) foreach (var s in data)
_db.Orm.MapEntityValue(_entityType, rets[idx++], s); _db.Orm.MapEntityValue(_entityType, rets[idx++], s);
@ -210,7 +210,7 @@ namespace FreeSql
foreach (var midWhere in midWheres) delall.Where(midWhere); foreach (var midWhere in midWheres) delall.Where(midWhere);
var sql = delall.ToSql(); var sql = delall.ToSql();
delall.ExecuteAffrows(); delall.ExecuteAffrows();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw });
} }
else //保存 else //保存
{ {
@ -331,7 +331,7 @@ namespace FreeSql
var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig); var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig);
var affrows = update.ExecuteAffrows(); var affrows = update.ExecuteAffrows();
_db._entityChangeReport.AddRange(updateSource.Select(a => new DbContext.EntityChangeInfo { Object = a, Type = DbContext.EntityChangeType.Update })); _db._entityChangeReport.AddRange(updateSource.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a, Type = DbContext.EntityChangeType.Update }));
foreach (var newval in data) foreach (var newval in data)
{ {
@ -389,7 +389,7 @@ namespace FreeSql
{ {
if (dels.Any() == false) return 0; if (dels.Any() == false) return 0;
var affrows = this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrows(); var affrows = this.OrmDelete(dels.Select(a => a.Value)).ExecuteAffrows();
_db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Delete })); _db._entityChangeReport.AddRange(dels.Select(a => new DbContext.EntityChangeReport.ChangeInfo { Object = a.Value, Type = DbContext.EntityChangeType.Delete }));
return Math.Max(dels.Length, affrows); return Math.Max(dels.Length, affrows);
} }

View File

@ -46,6 +46,16 @@
<typeparam name="TEntity"></typeparam> <typeparam name="TEntity"></typeparam>
<param name="data"></param> <param name="data"></param>
</member> </member>
<member name="P:FreeSql.DbContext.EntityChangeReport.Report">
<summary>
实体变化记录
</summary>
</member>
<member name="P:FreeSql.DbContext.EntityChangeReport.OnChange">
<summary>
实体变化事件
</summary>
</member>
<member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList"> <member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList">
<summary> <summary>
是否开启一对多,多对多联级保存功能<para></para> 是否开启一对多,多对多联级保存功能<para></para>
@ -219,14 +229,9 @@
开启工作单元 开启工作单元
</summary> </summary>
</member> </member>
<member name="P:FreeSql.IUnitOfWork.OnEntityChange"> <member name="P:FreeSql.IUnitOfWork.EntityChangeReport">
<summary> <summary>
实体变化事件 此工作单元内的实体变化跟踪
</summary>
</member>
<member name="P:FreeSql.UnitOfWork.EntityChangeReport">
<summary>
工作单元的实体变化记录
</summary> </summary>
</member> </member>
<member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)"> <member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">

View File

@ -59,16 +59,12 @@ namespace FreeSql
int ret; int ret;
try try
{ {
if (UnitOfWork == null) EmitOnEntityChange(_entityChangeReport); if (UnitOfWork?.EntityChangeReport != null)
else
{ {
var uow = UnitOfWork as UnitOfWork; UnitOfWork.EntityChangeReport.Report.AddRange(_entityChangeReport);
if (uow != null) if (UnitOfWork.EntityChangeReport.OnChange == null) UnitOfWork.EntityChangeReport.OnChange = Options.OnEntityChange;
{ } else
uow.EntityChangeReport.AddRange(_entityChangeReport); EmitOnEntityChange(_entityChangeReport);
if (uow.OnEntityChange == null) uow.OnEntityChange = Options.OnEntityChange;
}
}
} }
finally finally
{ {

View File

@ -75,7 +75,7 @@ namespace FreeSql
var delete = _dbset.OrmDeleteInternal(null).Where(predicate); var delete = _dbset.OrmDeleteInternal(null).Where(predicate);
var sql = delete.ToSql(); var sql = delete.ToSql();
var affrows = delete.ExecuteAffrows(); var affrows = delete.ExecuteAffrows();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw });
return affrows; return affrows;
} }
async public Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate) async public Task<int> DeleteAsync(Expression<Func<TEntity, bool>> predicate)
@ -83,7 +83,7 @@ namespace FreeSql
var delete = _dbset.OrmDeleteInternal(null).Where(predicate); var delete = _dbset.OrmDeleteInternal(null).Where(predicate);
var sql = delete.ToSql(); var sql = delete.ToSql();
var affrows = await delete.ExecuteAffrowsAsync(); var affrows = await delete.ExecuteAffrowsAsync();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw }); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = sql, Type = DbContext.EntityChangeType.SqlRaw });
return affrows; return affrows;
} }

View File

@ -35,8 +35,8 @@ namespace FreeSql
void Open(); void Open();
/// <summary> /// <summary>
/// 实体变化事件 /// 此工作单元内的实体变化跟踪
/// </summary> /// </summary>
Action<List<DbContext.EntityChangeInfo>> OnEntityChange { get; set; } DbContext.EntityChangeReport EntityChangeReport { get; }
} }
} }

View File

@ -3,6 +3,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Linq;
using System.Threading; using System.Threading;
namespace FreeSql namespace FreeSql
@ -33,7 +34,7 @@ namespace FreeSql
#if ns20 #if ns20
Current.Value = null; Current.Value = null;
#endif #endif
EntityChangeReport.Clear(); EntityChangeReport?.Report.Clear();
} }
public bool Enable { get; private set; } = true; public bool Enable { get; private set; } = true;
@ -81,7 +82,8 @@ namespace FreeSql
if (_tran != null) if (_tran != null)
{ {
_tran.Commit(); _tran.Commit();
OnEntityChange?.Invoke(EntityChangeReport); if (EntityChangeReport != null && EntityChangeReport.OnChange != null && EntityChangeReport.Report.Any() == true)
EntityChangeReport.OnChange.Invoke(EntityChangeReport.Report);
} }
} }
finally finally
@ -101,11 +103,7 @@ namespace FreeSql
} }
} }
public Action<List<DbContext.EntityChangeInfo>> OnEntityChange { get; set; } public DbContext.EntityChangeReport EntityChangeReport { get; } = new DbContext.EntityChangeReport();
/// <summary>
/// 工作单元的实体变化记录
/// </summary>
public List<DbContext.EntityChangeInfo> EntityChangeReport { get; } = new List<DbContext.EntityChangeInfo>();
~UnitOfWork() ~UnitOfWork()
{ {