diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index f59890cb..901f0b8c 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -212,6 +212,17 @@ namespace FreeSql this.Set().AttachOnlyPrimary(data); return this; } + + /// + /// 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + /// + /// 最新的实体对象,它将与附加实体的状态对比 + /// + public Dictionary CompareState(TEntity newdata) where TEntity : class + { + CheckEntityTypeOrThrow(typeof(TEntity)); + return this.Set().CompareState(newdata); + } #if net40 #else public Task AddAsync(TEntity data) where TEntity : class diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index f4aef4f3..26bdc091 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -219,6 +219,31 @@ namespace FreeSql return this; } + /// + /// 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + /// + /// 最新的实体对象,它将与附加实体的状态对比 + /// + public Dictionary CompareState(TEntity newdata) + { + if (newdata == null) return null; + if (_table.Primarys.Any() == false) throw new Exception($"不可比较,实体没有主键:{_db.OrmOriginal.GetEntityString(_entityType, newdata)}"); + var key = _db.OrmOriginal.GetEntityKeyString(_entityType, newdata, false); + if (string.IsNullOrEmpty(key)) throw new Exception($"不可比较,未设置主键的值:{_db.OrmOriginal.GetEntityString(_entityType, newdata)}"); + if (_states.TryGetValue(key, out var oldState) == false || oldState == null) + return _table.ColumnsByCs.ToDictionary(a => a.Key, a => new object[] + { + _db.OrmOriginal.GetEntityValueWithPropertyName(_entityType, newdata, a.Key), + null + }); + + return _db.OrmOriginal.CompareEntityValueReturnColumns(_entityType, oldState.Value, newdata, false).ToDictionary(a => a, a => new object[] + { + _db.OrmOriginal.GetEntityValueWithPropertyName(_entityType, newdata, a), + _db.OrmOriginal.GetEntityValueWithPropertyName(_entityType, oldState.Value, a) + }); + } + /// /// 清空状态数据 /// diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9cd1afb5..23060b9c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -62,6 +62,13 @@ + + + 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + + 最新的实体对象,它将与附加实体的状态对比 + + Type = Update 的时候,获取更新之前的对象 @@ -130,6 +137,13 @@ + + + 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + + 最新的实体对象,它将与附加实体的状态对比 + + 清空状态数据 @@ -314,6 +328,13 @@ + + + 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + + 最新的实体对象,它将与附加实体的状态对比 + + 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index cae91630..8551c248 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -127,6 +127,7 @@ namespace FreeSql return this; } public void FlushState() => _dbset.FlushState(); + public Dictionary CompareState(TEntity newdata) => _dbset.CompareState(newdata); public virtual TEntity InsertOrUpdate(TEntity entity) { diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index 91dd05fc..a62092a7 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -58,6 +58,12 @@ namespace FreeSql /// /// IBaseRepository AttachOnlyPrimary(TEntity data); + /// + /// 比较实体,计算出值发生变化的属性,以及属性变化的前后值 + /// + /// 最新的实体对象,它将与附加实体的状态对比 + /// + Dictionary CompareState(TEntity newdata); int Update(TEntity entity); int Update(IEnumerable entitys); diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index ef14b310..71177284 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -28,6 +28,7 @@ namespace FreeSql.Tests items[0].Title = "88"; //items[1].Title = "88"; items[2].Title = "88"; + var changed = repos.CompareState(items[0]); int x = await repos.UpdateAsync(items); }