- 增加 FreeSql.DbContext 实体对象的变化事件;

> 文档:https://github.com/2881099/FreeSql/wiki/DbContext#%E5%AE%9E%E4%BD%93%E5%8F%98%E5%8C%96%E4%BA%8B%E4%BB%B6
- 补充 Aop.CurdBefore 事件参数 Table 实体类型的元数据;
This commit is contained in:
28810
2019-10-12 01:02:42 +08:00
parent 9a8d51da50
commit e823f9dcd0
43 changed files with 285 additions and 146 deletions

View File

@ -59,8 +59,8 @@ namespace FreeSql
protected virtual IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys) => _db.Orm.Update<TEntity>().AsType(_entityType).SetSource(entitys).WithTransaction(_uow?.GetOrBeginTransaction());
protected virtual IDelete<TEntity> OrmDelete(object dywhere) => _db.Orm.Delete<TEntity>().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere);
internal void EnqueueToDbContext(DbContext.ExecCommandInfoType actionType, EntityState state) =>
_db.EnqueueAction(actionType, this, typeof(EntityState), _entityType, state);
internal void EnqueueToDbContext(DbContext.EntityChangeType changeType, EntityState state) =>
_db.EnqueueAction(changeType, this, typeof(EntityState), _entityType, state);
internal void IncrAffrows(int affrows) =>
_db._affrows += affrows;

View File

@ -23,6 +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 }));
return affrows;
}
@ -45,6 +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 });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true);
@ -53,6 +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 });
IncrAffrows(1);
_db.Orm.MapEntityValue(_entityType, newval, data);
Attach(newval);
@ -67,6 +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 });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true);
@ -74,7 +78,7 @@ namespace FreeSql
return;
}
}
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data));
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true);
@ -100,6 +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 }));
var idx = 0;
foreach (var s in data)
_db.Orm.MapEntityValue(_entityType, rets[idx++], s);
@ -119,7 +124,7 @@ namespace FreeSql
{
//进入队列,等待 SaveChanges 时执行
foreach (var item in data)
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item));
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
AttachRange(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
foreach (var item in data)
@ -193,7 +198,9 @@ namespace FreeSql
{
var delall = _db.Orm.Delete<object>().AsType(tref.RefMiddleEntityType);
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 });
}
else //保存
{
@ -314,6 +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 }));
foreach (var newval in data)
{
@ -352,7 +360,7 @@ namespace FreeSql
var state = CreateEntityState(item);
state.OldValue = item;
EnqueueToDbContext(DbContext.ExecCommandInfoType.Update, state);
EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
}
if (_db.Options.EnableAddOrUpdateNavigateList)
foreach (var item in data)
@ -365,6 +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 }));
return Math.Max(dels.Length, affrows);
}
#endregion

View File

@ -23,6 +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 }));
return affrows;
}
@ -45,6 +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 });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true);
@ -53,6 +55,7 @@ namespace FreeSql
{
DbContextExecCommand();
var newval = this.OrmInsert(data).ExecuteInserted().First();
_db._entityChangeReport.Add(new DbContext.EntityChangeInfo { Object = newval, Type = DbContext.EntityChangeType.Insert });
IncrAffrows(1);
_db.Orm.MapEntityValue(_entityType, newval, data);
Attach(newval);
@ -67,6 +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 });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true);
@ -74,7 +78,7 @@ namespace FreeSql
return;
}
}
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data));
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true);
@ -104,6 +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 }));
var idx = 0;
foreach (var s in data)
_db.Orm.MapEntityValue(_entityType, rets[idx++], s);
@ -123,7 +128,7 @@ namespace FreeSql
{
//进入队列,等待 SaveChanges 时执行
foreach (var item in data)
EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item));
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
AttachRange(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
foreach (var item in data)
@ -203,7 +208,9 @@ namespace FreeSql
{
var delall = _db.Orm.Delete<object>().AsType(tref.RefMiddleEntityType);
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 });
}
else //保存
{
@ -324,6 +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 }));
foreach (var newval in data)
{
@ -368,7 +376,7 @@ namespace FreeSql
var state = CreateEntityState(item);
state.OldValue = item;
EnqueueToDbContext(DbContext.ExecCommandInfoType.Update, state);
EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
}
if (_db.Options.EnableAddOrUpdateNavigateList)
foreach (var item in data)
@ -381,6 +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 }));
return Math.Max(dels.Length, affrows);
}
@ -398,7 +407,7 @@ namespace FreeSql
_states.TryRemove(state.Key, out var trystate);
_db.Orm.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, item);
EnqueueToDbContext(DbContext.ExecCommandInfoType.Delete, state);
EnqueueToDbContext(DbContext.EntityChangeType.Delete, state);
}
}
#endregion