From d7877924a5f0d6b5114bc4907cc07640baf828a1 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 15 Oct 2019 19:18:31 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E8=B0=83=E6=95=B4=20DbContext.EntityChange?= =?UTF-8?q?Info=20=E7=B1=BB=E5=90=8D=E4=B8=BA=20DbContext.EntityChangeRepo?= =?UTF-8?q?rt.ChangeInfo=EF=BC=9B=20-=20=E8=B0=83=E6=95=B4=20IUnitOfWork?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=A7=BB=E9=99=A4=20OnEntityChan?= =?UTF-8?q?ge=20=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=A2=9E=E5=8A=A0=20EntityChan?= =?UTF-8?q?geReport=20=E5=B1=9E=E6=80=A7=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbContext/DbContext.cs | 23 ++++++++++++++----- .../DbContext/DbContextOptions.cs | 2 +- FreeSql.DbContext/DbSet/DbSetAsync.cs | 16 ++++++------- FreeSql.DbContext/DbSet/DbSetSync.cs | 16 ++++++------- FreeSql.DbContext/FreeSql.DbContext.xml | 19 +++++++++------ .../ContextSet/RepositoryDbContext.cs | 14 ++++------- .../Repository/Repository/BaseRepository.cs | 4 ++-- FreeSql.DbContext/UnitOfWork/IUnitOfWork.cs | 4 ++-- FreeSql.DbContext/UnitOfWork/UnitOfWork.cs | 12 ++++------ 9 files changed, 60 insertions(+), 50 deletions(-) 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() {