- 增加 DbContext/Repository 比较变化方法 CompareState;

This commit is contained in:
2881099 2021-11-10 02:18:59 +08:00
parent f007b3fa0e
commit 352ceceb23
6 changed files with 65 additions and 0 deletions

View File

@ -212,6 +212,17 @@ namespace FreeSql
this.Set<TEntity>().AttachOnlyPrimary(data);
return this;
}
/// <summary>
/// 比较实体,计算出值发生变化的属性,以及属性变化的前后值
/// </summary>
/// <param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
/// <returns></returns>
public Dictionary<string, object[]> CompareState<TEntity>(TEntity newdata) where TEntity : class
{
CheckEntityTypeOrThrow(typeof(TEntity));
return this.Set<TEntity>().CompareState(newdata);
}
#if net40
#else
public Task AddAsync<TEntity>(TEntity data) where TEntity : class

View File

@ -219,6 +219,31 @@ namespace FreeSql
return this;
}
/// <summary>
/// 比较实体,计算出值发生变化的属性,以及属性变化的前后值
/// </summary>
/// <param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
/// <returns></returns>
public Dictionary<string, object[]> 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)
});
}
/// <summary>
/// 清空状态数据
/// </summary>

View File

@ -62,6 +62,13 @@
<typeparam name="TEntity"></typeparam>
<param name="data"></param>
</member>
<member name="M:FreeSql.DbContext.CompareState``1(``0)">
<summary>
比较实体,计算出值发生变化的属性,以及属性变化的前后值
</summary>
<param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
<returns></returns>
</member>
<member name="P:FreeSql.DbContext.EntityChangeReport.ChangeInfo.BeforeObject">
<summary>
Type = Update 的时候,获取更新之前的对象
@ -130,6 +137,13 @@
</summary>
<param name="data"></param>
</member>
<member name="M:FreeSql.DbSet`1.CompareState(`0)">
<summary>
比较实体,计算出值发生变化的属性,以及属性变化的前后值
</summary>
<param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
<returns></returns>
</member>
<member name="M:FreeSql.DbSet`1.FlushState">
<summary>
清空状态数据
@ -314,6 +328,13 @@
</summary>
<param name="data"></param>
</member>
<member name="M:FreeSql.IBaseRepository`1.CompareState(`0)">
<summary>
比较实体,计算出值发生变化的属性,以及属性变化的前后值
</summary>
<param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
<returns></returns>
</member>
<member name="M:FreeSql.IBaseRepository`1.SaveMany(`0,System.String)">
<summary>
保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比)<para></para>

View File

@ -127,6 +127,7 @@ namespace FreeSql
return this;
}
public void FlushState() => _dbset.FlushState();
public Dictionary<string, object[]> CompareState(TEntity newdata) => _dbset.CompareState(newdata);
public virtual TEntity InsertOrUpdate(TEntity entity)
{

View File

@ -58,6 +58,12 @@ namespace FreeSql
/// </summary>
/// <param name="data"></param>
IBaseRepository<TEntity> AttachOnlyPrimary(TEntity data);
/// <summary>
/// 比较实体,计算出值发生变化的属性,以及属性变化的前后值
/// </summary>
/// <param name="newdata">最新的实体对象,它将与附加实体的状态对比</param>
/// <returns></returns>
Dictionary<string, object[]> CompareState(TEntity newdata);
int Update(TEntity entity);
int Update(IEnumerable<TEntity> entitys);

View File

@ -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);
}