mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 04:18:16 +08:00
@ -47,6 +47,8 @@ namespace FreeSql
|
||||
{
|
||||
this._dicUpdateTimes.Clear();
|
||||
this._states.Clear();
|
||||
this._statesEditing.Clear();
|
||||
this._dataEditing = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -123,7 +125,6 @@ namespace FreeSql
|
||||
public ISelect<TEntity> WhereIf(bool condition, Expression<Func<TEntity, bool>> exp) => this.OrmSelect(null).WhereIf(condition, exp);
|
||||
|
||||
protected ConcurrentDictionary<string, EntityState> _states = new ConcurrentDictionary<string, EntityState>();
|
||||
internal ConcurrentDictionary<string, EntityState> _statesInternal => _states;
|
||||
TableInfo _tablePriv;
|
||||
protected TableInfo _table => _tablePriv ?? (_tablePriv = _db.OrmOriginal.CodeFirst.GetTableByEntity(_entityType));
|
||||
ColumnInfo[] _tableIdentitysPriv, _tableServerTimesPriv;
|
||||
|
@ -530,5 +530,91 @@ namespace FreeSql
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region BeginEdit
|
||||
protected List<TEntity> _dataEditing;
|
||||
protected ConcurrentDictionary<string, EntityState> _statesEditing = new ConcurrentDictionary<string, EntityState>();
|
||||
|
||||
/// <summary>
|
||||
/// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行<para></para>
|
||||
/// 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】<para></para><para></para>
|
||||
/// 示例:https://github.com/dotnetcore/FreeSql/issues/397<para></para>
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
//public void BeginEdit(List<TEntity> data)
|
||||
//{
|
||||
// if (data == null || data.Any() == false) return;
|
||||
// if (_table.Primarys.Any() == false) throw new Exception($"不可进行编辑,实体没有主键:{_db.OrmOriginal.GetEntityString(_entityType, data.First())}");
|
||||
// _statesEditing.Clear();
|
||||
// _dataEditing = data;
|
||||
// foreach (var item in data)
|
||||
// {
|
||||
// var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
|
||||
// if (string.IsNullOrEmpty(key)) continue;
|
||||
|
||||
// _statesEditing.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) =>
|
||||
// {
|
||||
// _db.OrmOriginal.MapEntityValue(_entityType, item, ov.Value);
|
||||
// ov.Time = DateTime.Now;
|
||||
// return ov;
|
||||
// });
|
||||
// }
|
||||
//}
|
||||
///// <summary>
|
||||
///// 完成编辑数据,进行保存动作<para></para>
|
||||
///// 该方法根据 BeginEdit 传入的状态分析出添加、修改、删除 SQL 语句
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//public int EndEdit()
|
||||
//{
|
||||
// var beforeAffrows = 0;
|
||||
// if (_dataEditing == null) return 0;
|
||||
// var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
|
||||
// _db.Options.EnableAddOrUpdateNavigateList = false;
|
||||
// try
|
||||
// {
|
||||
// DbContextFlushCommand();
|
||||
// var addList = new List<TEntity>();
|
||||
// var ediList = new List<TEntity>();
|
||||
// foreach (var item in _dataEditing)
|
||||
// {
|
||||
// var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
|
||||
// if (_statesEditing.TryRemove(key, out var state) == false)
|
||||
// {
|
||||
// addList.Add(item);
|
||||
// continue;
|
||||
// }
|
||||
// _states.AddOrUpdate(key, k => state, (k, ov) =>
|
||||
// {
|
||||
// ov.Value = state.Value;
|
||||
// ov.Time = DateTime.Now;
|
||||
// return ov;
|
||||
// });
|
||||
// if (_db.OrmOriginal.CompareEntityValueReturnColumns(_entityType, item, state.Value, false).Any())
|
||||
// ediList.Add(item);
|
||||
// }
|
||||
// beforeAffrows = _db._affrows;
|
||||
// AddRange(addList);
|
||||
// UpdateRange(ediList);
|
||||
|
||||
// DbContextFlushCommand();
|
||||
// var delList = _statesEditing.Values.OrderBy(a => a.Time).ToArray();
|
||||
// _db._affrows += DbContextBatchRemove(delList); //为了减的少不必要的开销,此处没有直接调用 RemoveRange
|
||||
// foreach (var state in delList)
|
||||
// {
|
||||
// _db.OrmOriginal.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, state.Value);
|
||||
// _states.TryRemove(state.Key, out var oldstate);
|
||||
// }
|
||||
// DbContextFlushCommand();
|
||||
// }
|
||||
// finally
|
||||
// {
|
||||
// _dataEditing = null;
|
||||
// _statesEditing.Clear();
|
||||
// _db.Options.EnableAddOrUpdateNavigateList = oldEnable;
|
||||
// }
|
||||
// return _db._affrows - beforeAffrows;
|
||||
//}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user