diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index da822e03..f9d1d4f0 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -46,9 +46,9 @@ namespace FreeSql return _optionsPriv; } } - internal void EmitOnEntityChange(List report) + internal void EmitOnEntityChange(List report) { - var oec = UnitOfWork?.OnEntityChange ?? Options.OnEntityChange; + var oec = UnitOfWork?.EntityChangeReport?.OnChange ?? Options.OnEntityChange; if (oec == null || report == null || report.Any() == false) return; oec(report); } @@ -155,12 +155,23 @@ namespace FreeSql #endregion #region Queue Action - internal List _entityChangeReport = new List(); - public class EntityChangeInfo + public class EntityChangeReport { - public object Object { get; set; } - public EntityChangeType Type { get; set; } + public class ChangeInfo + { + public object Object { get; set; } + public EntityChangeType Type { get; set; } + } + /// + /// 实体变化记录 + /// + public List Report { get; } = new List(); + /// + /// 实体变化事件 + /// + public Action> OnChange { get; set; } } + internal List _entityChangeReport = new List(); public enum EntityChangeType { Insert, Update, Delete, SqlRaw } internal class ExecCommandInfo { diff --git a/FreeSql.DbContext/DbContext/DbContextOptions.cs b/FreeSql.DbContext/DbContext/DbContextOptions.cs index 5c81e9f5..95cd5630 100644 --- a/FreeSql.DbContext/DbContext/DbContextOptions.cs +++ b/FreeSql.DbContext/DbContext/DbContextOptions.cs @@ -25,6 +25,6 @@ namespace FreeSql /// /// 实体变化事件 /// - public Action> OnEntityChange { get; set; } + public Action> OnEntityChange { get; set; } } } diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index cfa2ceb4..1696fe30 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -23,7 +23,7 @@ namespace FreeSql { if (adds.Any() == false) return 0; 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; } @@ -46,7 +46,7 @@ namespace FreeSql var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); IncrAffrows(1); _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); if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data, true); @@ -55,7 +55,7 @@ namespace FreeSql { await DbContextExecCommandAsync(); 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); _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); @@ -70,7 +70,7 @@ namespace FreeSql var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); IncrAffrows(1); _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); if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data, true); @@ -104,7 +104,7 @@ namespace FreeSql await DbContextExecCommandAsync(); var rets = await this.OrmInsert(data).ExecuteInsertedAsync(); 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; foreach (var s in data) _db.Orm.MapEntityValue(_entityType, rets[idx++], s); @@ -200,7 +200,7 @@ namespace FreeSql foreach (var midWhere in midWheres) delall.Where(midWhere); var sql = delall.ToSql(); 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 //保存 { @@ -321,7 +321,7 @@ namespace FreeSql var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig); 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) { @@ -373,7 +373,7 @@ namespace FreeSql { if (dels.Any() == false) return 0; 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); } #endregion diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 2443717f..a0aeddf1 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -23,7 +23,7 @@ namespace FreeSql { if (adds.Any() == false) return 0; 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; } @@ -46,7 +46,7 @@ namespace FreeSql var idtval = this.OrmInsert(data).ExecuteIdentity(); IncrAffrows(1); _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); if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data, true); @@ -55,7 +55,7 @@ namespace FreeSql { DbContextExecCommand(); 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); _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); @@ -70,7 +70,7 @@ namespace FreeSql var idtval = this.OrmInsert(data).ExecuteIdentity(); IncrAffrows(1); _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); if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data, true); @@ -108,7 +108,7 @@ namespace FreeSql DbContextExecCommand(); var rets = this.OrmInsert(data).ExecuteInserted(); 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; foreach (var s in data) _db.Orm.MapEntityValue(_entityType, rets[idx++], s); @@ -210,7 +210,7 @@ namespace FreeSql foreach (var midWhere in midWheres) delall.Where(midWhere); var sql = delall.ToSql(); 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 //保存 { @@ -331,7 +331,7 @@ namespace FreeSql var update = this.OrmUpdate(null).SetSource(updateSource).IgnoreColumns(cuig); 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) { @@ -389,7 +389,7 @@ namespace FreeSql { if (dels.Any() == false) return 0; 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); } diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9b3a3998..5ae14b30 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -46,6 +46,16 @@ + + + 实体变化记录 + + + + + 实体变化事件 + + 是否开启一对多,多对多联级保存功能 @@ -219,14 +229,9 @@ 开启工作单元 - + - 实体变化事件 - - - - - 工作单元的实体变化记录 + 此工作单元内的实体变化跟踪 diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs index d18ceb68..b09d7463 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs @@ -59,16 +59,12 @@ namespace FreeSql int ret; try { - if (UnitOfWork == null) EmitOnEntityChange(_entityChangeReport); - else + if (UnitOfWork?.EntityChangeReport != null) { - var uow = UnitOfWork as UnitOfWork; - if (uow != null) - { - uow.EntityChangeReport.AddRange(_entityChangeReport); - if (uow.OnEntityChange == null) uow.OnEntityChange = Options.OnEntityChange; - } - } + UnitOfWork.EntityChangeReport.Report.AddRange(_entityChangeReport); + if (UnitOfWork.EntityChangeReport.OnChange == null) UnitOfWork.EntityChangeReport.OnChange = Options.OnEntityChange; + } else + EmitOnEntityChange(_entityChangeReport); } finally { diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index ea7dfa67..ff43c3b1 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -75,7 +75,7 @@ namespace FreeSql var delete = _dbset.OrmDeleteInternal(null).Where(predicate); var sql = delete.ToSql(); 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; } async public Task DeleteAsync(Expression> predicate) @@ -83,7 +83,7 @@ namespace FreeSql var delete = _dbset.OrmDeleteInternal(null).Where(predicate); var sql = delete.ToSql(); 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; } diff --git a/FreeSql.DbContext/UnitOfWork/IUnitOfWork.cs b/FreeSql.DbContext/UnitOfWork/IUnitOfWork.cs index f5c77638..2dc2b691 100644 --- a/FreeSql.DbContext/UnitOfWork/IUnitOfWork.cs +++ b/FreeSql.DbContext/UnitOfWork/IUnitOfWork.cs @@ -35,8 +35,8 @@ namespace FreeSql void Open(); /// - /// 实体变化事件 + /// 此工作单元内的实体变化跟踪 /// - Action> OnEntityChange { get; set; } + DbContext.EntityChangeReport EntityChangeReport { get; } } } diff --git a/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs b/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs index 9167368c..8aeb4d6f 100644 --- a/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs +++ b/FreeSql.DbContext/UnitOfWork/UnitOfWork.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Threading; namespace FreeSql @@ -33,7 +34,7 @@ namespace FreeSql #if ns20 Current.Value = null; #endif - EntityChangeReport.Clear(); + EntityChangeReport?.Report.Clear(); } public bool Enable { get; private set; } = true; @@ -81,7 +82,8 @@ namespace FreeSql if (_tran != null) { _tran.Commit(); - OnEntityChange?.Invoke(EntityChangeReport); + if (EntityChangeReport != null && EntityChangeReport.OnChange != null && EntityChangeReport.Report.Any() == true) + EntityChangeReport.OnChange.Invoke(EntityChangeReport.Report); } } finally @@ -101,11 +103,7 @@ namespace FreeSql } } - public Action> OnEntityChange { get; set; } - /// - /// 工作单元的实体变化记录 - /// - public List EntityChangeReport { get; } = new List(); + public DbContext.EntityChangeReport EntityChangeReport { get; } = new DbContext.EntityChangeReport(); ~UnitOfWork() {