- 调整 增加支持 OneToOne 级联保存,EnableAddOrUpdateNavigateList 改名为 EnableAddOrUpdateNavigate;

This commit is contained in:
2881099
2022-05-04 15:49:05 +08:00
parent c9fa4d8983
commit b0ac5a8739
38 changed files with 190 additions and 198 deletions

View File

@ -54,8 +54,8 @@ namespace FreeSql
_db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
if (_db.Options.EnableAddOrUpdateNavigate)
await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
}
else
{
@ -65,8 +65,8 @@ namespace FreeSql
IncrAffrows(1);
_db.OrmOriginal.MapEntityValue(_entityType, newval, data);
Attach(newval);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
if (_db.Options.EnableAddOrUpdateNavigate)
await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
}
return;
default:
@ -78,8 +78,8 @@ namespace FreeSql
_db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
if (_db.Options.EnableAddOrUpdateNavigate)
await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
return;
}
break;
@ -87,8 +87,8 @@ namespace FreeSql
}
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
if (_db.Options.EnableAddOrUpdateNavigate)
await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
}
public Task AddAsync(TEntity data, CancellationToken cancellationToken = default) => AddPrivAsync(data, true, cancellationToken);
async public Task AddRangeAsync(IEnumerable<TEntity> data, CancellationToken cancellationToken = default)
@ -120,9 +120,9 @@ namespace FreeSql
_db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
IncrAffrows(rets.Count);
AttachRange(rets);
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken);
await AddOrUpdateNavigateAsync(item, true, null, cancellationToken);
return;
default:
if (_tableIdentitys.Length == 1)
@ -138,9 +138,9 @@ namespace FreeSql
foreach (var item in data)
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
AttachRange(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken);
await AddOrUpdateNavigateAsync(item, true, null, cancellationToken);
}
async public Task SaveManyAsync(TEntity item, string propertyName, CancellationToken cancellationToken = default)
@ -160,11 +160,11 @@ namespace FreeSql
}
await DbContextFlushCommandAsync(cancellationToken);
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
_db.Options.EnableAddOrUpdateNavigateList = false;
var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
_db.Options.EnableAddOrUpdateNavigate = false;
try
{
await AddOrUpdateNavigateListAsync(item, false, propertyName, cancellationToken);
await AddOrUpdateNavigateAsync(item, false, propertyName, cancellationToken);
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
{
await DbContextFlushCommandAsync(cancellationToken);
@ -197,10 +197,10 @@ namespace FreeSql
}
finally
{
_db.Options.EnableAddOrUpdateNavigateList = oldEnable;
_db.Options.EnableAddOrUpdateNavigate = oldEnable;
}
}
async Task AddOrUpdateNavigateListAsync(TEntity item, bool isAdd, string propertyName, CancellationToken cancellationToken)
async Task AddOrUpdateNavigateAsync(TEntity item, bool isAdd, string propertyName, CancellationToken cancellationToken)
{
Func<PropertyInfo, Task> action = async prop =>
{
@ -213,15 +213,17 @@ namespace FreeSql
switch (tref.RefType)
{
case Internal.Model.TableRefType.OneToOne:
//var propValItem = GetItemValue(item, prop);
//for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
//{
// var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
// _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
//}
//if (isAdd) await refSet.AddAsync(propValItem);
//else await refSet.AddOrUpdateAsync(propValItem);
//return;
refSet = GetDbSetObject(tref.RefEntityType);
var propValItem = GetItemValue(item, prop);
if (propValItem == null) return;
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
{
var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
_db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
}
if (isAdd) await refSet.AddAsync(propValItem);
else await refSet.AddOrUpdateAsync(propValItem);
return;
case Internal.Model.TableRefType.ManyToOne:
return;
}
@ -441,9 +443,9 @@ namespace FreeSql
state.OldValue = item;
EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
}
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
await AddOrUpdateNavigateListAsync(item, false, null, cancellationToken);
await AddOrUpdateNavigateAsync(item, false, null, cancellationToken);
}
#endregion

View File

@ -53,8 +53,8 @@ namespace FreeSql
_db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true, null);
if (_db.Options.EnableAddOrUpdateNavigate)
AddOrUpdateNavigate(data, true, null);
}
else
{
@ -64,8 +64,8 @@ namespace FreeSql
IncrAffrows(1);
_db.OrmOriginal.MapEntityValue(_entityType, newval, data);
Attach(newval);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true, null);
if (_db.Options.EnableAddOrUpdateNavigate)
AddOrUpdateNavigate(data, true, null);
}
return;
default:
@ -77,8 +77,8 @@ namespace FreeSql
_db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
_db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true, null);
if (_db.Options.EnableAddOrUpdateNavigate)
AddOrUpdateNavigate(data, true, null);
return;
}
break;
@ -86,8 +86,8 @@ namespace FreeSql
}
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
Attach(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
AddOrUpdateNavigateList(data, true, null);
if (_db.Options.EnableAddOrUpdateNavigate)
AddOrUpdateNavigate(data, true, null);
}
/// <summary>
/// 添加
@ -123,9 +123,9 @@ namespace FreeSql
_db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
IncrAffrows(rets.Count);
AttachRange(rets);
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
AddOrUpdateNavigateList(item, true, null);
AddOrUpdateNavigate(item, true, null);
return;
default:
if (_tableIdentitys.Length == 1)
@ -141,9 +141,9 @@ namespace FreeSql
foreach (var item in data)
EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
AttachRange(data);
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
AddOrUpdateNavigateList(item, true, null);
AddOrUpdateNavigate(item, true, null);
}
/// <summary>
@ -172,11 +172,11 @@ namespace FreeSql
}
DbContextFlushCommand();
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
_db.Options.EnableAddOrUpdateNavigateList = false;
var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
_db.Options.EnableAddOrUpdateNavigate = false;
try
{
AddOrUpdateNavigateList(item, false, propertyName);
AddOrUpdateNavigate(item, false, propertyName);
if (tref.RefType == Internal.Model.TableRefType.OneToMany)
{
DbContextFlushCommand();
@ -209,10 +209,10 @@ namespace FreeSql
}
finally
{
_db.Options.EnableAddOrUpdateNavigateList = oldEnable;
_db.Options.EnableAddOrUpdateNavigate = oldEnable;
}
}
void AddOrUpdateNavigateList(TEntity item, bool isAdd, string propertyName)
void AddOrUpdateNavigate(TEntity item, bool isAdd, string propertyName)
{
Action<PropertyInfo> action = prop =>
{
@ -225,15 +225,17 @@ namespace FreeSql
switch (tref.RefType)
{
case Internal.Model.TableRefType.OneToOne:
//var propValItem = GetItemValue(item, prop);
//for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
//{
// var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
// _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
//}
//if (isAdd) refSet.Add(propValItem);
//else refSet.AddOrUpdate(propValItem);
//return;
refSet = GetDbSetObject(tref.RefEntityType);
var propValItem = GetItemValue(item, prop);
if (propValItem == null) return;
for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
{
var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
_db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
}
if (isAdd) refSet.Add(propValItem);
else refSet.AddOrUpdate(propValItem);
return;
case Internal.Model.TableRefType.ManyToOne:
return;
}
@ -483,9 +485,9 @@ namespace FreeSql
state.OldValue = item;
EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
}
if (_db.Options.EnableAddOrUpdateNavigateList)
if (_db.Options.EnableAddOrUpdateNavigate)
foreach (var item in data)
AddOrUpdateNavigateList(item, false, null);
AddOrUpdateNavigate(item, false, null);
}
#endregion
@ -603,8 +605,8 @@ namespace FreeSql
if (data == null) data = _dataEditing;
var beforeAffrows = 0;
if (data == null) return 0;
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
_db.Options.EnableAddOrUpdateNavigateList = false;
var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
_db.Options.EnableAddOrUpdateNavigate = false;
try
{
DbContextFlushCommand();
@ -646,7 +648,7 @@ namespace FreeSql
{
_dataEditing = null;
_statesEditing.Clear();
_db.Options.EnableAddOrUpdateNavigateList = oldEnable;
_db.Options.EnableAddOrUpdateNavigate = oldEnable;
}
return _db._affrows - beforeAffrows;
}