mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 20:08:15 +08:00
- 调整 增加支持 OneToOne 级联保存,EnableAddOrUpdateNavigateList 改名为 EnableAddOrUpdateNavigate;
This commit is contained in:
@ -46,7 +46,7 @@ namespace FreeSql
|
||||
_optionsPriv = new DbContextOptions();
|
||||
if (FreeSqlDbContextExtensions._dicSetDbContextOptions.TryGetValue(OrmOriginal.Ado.Identifier, out var opt))
|
||||
{
|
||||
_optionsPriv.EnableAddOrUpdateNavigateList = opt.EnableAddOrUpdateNavigateList;
|
||||
_optionsPriv.EnableAddOrUpdateNavigate = opt.EnableAddOrUpdateNavigate;
|
||||
_optionsPriv.EnableGlobalFilter = opt.EnableGlobalFilter;
|
||||
_optionsPriv.NoneParameter = opt.NoneParameter;
|
||||
_optionsPriv.OnEntityChange = opt.OnEntityChange;
|
||||
|
@ -7,20 +7,21 @@ namespace FreeSql
|
||||
{
|
||||
public class DbContextOptions
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 是否开启一对多,多对多级联保存功能<para></para>
|
||||
/// 是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能<para></para>
|
||||
/// <para></para>
|
||||
/// 【一对多】模型下, 保存时可级联保存实体的属性集合。出于使用安全考虑我们没做完整对比,只实现实体属性集合的添加或更新操作,所以不会删除实体属性集合的数据。<para></para>
|
||||
/// 【一对一】模型下,保存时级联保存 OneToOne 属性。
|
||||
/// <para></para>
|
||||
/// 【一对多】模型下,保存时级联保存 OneToMany 集合属性。出于安全考虑我们没做完整对比,只针对实体属性集合的添加或更新操作,因此不会删除数据库表已有的数据。<para></para>
|
||||
/// 完整对比的功能使用起来太危险,试想下面的场景:<para></para>
|
||||
/// - 保存的时候,实体的属性集合是空的,如何操作?记录全部删除?<para></para>
|
||||
/// - 保存的时候,由于数据库中记录非常之多,那么只想保存子表的部分数据,或者只需要添加,如何操作?<para></para>
|
||||
/// - 保存的时候,实体的属性集合为空时(!=null),表记录全部删除?<para></para>
|
||||
/// - 保存的时候,由于数据库子表的记录很多,只想保存子表的部分数据,又或者只需要添加,如何操作?
|
||||
/// <para></para>
|
||||
/// 【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(*注意不会更新)<para></para>
|
||||
/// 【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新)<para></para>
|
||||
/// - 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
|
||||
/// - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
|
||||
/// </summary>
|
||||
public bool EnableAddOrUpdateNavigateList { get; set; } = false;
|
||||
public bool EnableAddOrUpdateNavigate { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 使用无参数化设置(对应 IInsert/IUpdate)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -242,7 +242,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
|
||||
/// 使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
@ -263,7 +263,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
|
||||
if (_fsql.Select<object>().AsType(et).Any()) continue;
|
||||
|
||||
var repo = _fsql.GetRepository<object>();
|
||||
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
|
||||
repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
|
||||
repo.DbContextOptions.NoneParameter = true;
|
||||
repo.AsType(et);
|
||||
repo.Insert(sd);
|
||||
|
@ -329,7 +329,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
|
||||
public EfCoreTableFluent<T> HasData(T data) => HasData(new[] { data });
|
||||
|
||||
/// <summary>
|
||||
/// 使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
|
||||
/// 使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
@ -350,7 +350,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
|
||||
if (_fsql.Select<object>().AsType(et).Any()) continue;
|
||||
|
||||
var repo = _fsql.GetRepository<object>();
|
||||
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
|
||||
repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
|
||||
repo.DbContextOptions.NoneParameter = true;
|
||||
repo.AsType(et);
|
||||
repo.Insert(sd);
|
||||
|
@ -89,16 +89,18 @@
|
||||
刷新队列中的命令
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList">
|
||||
<member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigate">
|
||||
<summary>
|
||||
是否开启一对多,多对多级联保存功能<para></para>
|
||||
是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能<para></para>
|
||||
<para></para>
|
||||
【一对多】模型下, 保存时可级联保存实体的属性集合。出于使用安全考虑我们没做完整对比,只实现实体属性集合的添加或更新操作,所以不会删除实体属性集合的数据。<para></para>
|
||||
【一对一】模型下,保存时级联保存 OneToOne 属性。
|
||||
<para></para>
|
||||
【一对多】模型下,保存时级联保存 OneToMany 集合属性。出于安全考虑我们没做完整对比,只针对实体属性集合的添加或更新操作,因此不会删除数据库表已有的数据。<para></para>
|
||||
完整对比的功能使用起来太危险,试想下面的场景:<para></para>
|
||||
- 保存的时候,实体的属性集合是空的,如何操作?记录全部删除?<para></para>
|
||||
- 保存的时候,由于数据库中记录非常之多,那么只想保存子表的部分数据,或者只需要添加,如何操作?<para></para>
|
||||
- 保存的时候,实体的属性集合为空时(!=null),表记录全部删除?<para></para>
|
||||
- 保存的时候,由于数据库子表的记录很多,只想保存子表的部分数据,又或者只需要添加,如何操作?
|
||||
<para></para>
|
||||
【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(*注意不会更新)<para></para>
|
||||
【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新)<para></para>
|
||||
- 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
|
||||
- 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
|
||||
</summary>
|
||||
@ -230,7 +232,7 @@
|
||||
</member>
|
||||
<member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent.HasData(System.Collections.Generic.IEnumerable{System.Object})">
|
||||
<summary>
|
||||
使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
|
||||
使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
|
||||
</summary>
|
||||
<param name="data"></param>
|
||||
<returns></returns>
|
||||
@ -243,7 +245,7 @@
|
||||
</member>
|
||||
<member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent`1.HasData(System.Collections.Generic.IEnumerable{`0})">
|
||||
<summary>
|
||||
使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
|
||||
使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
|
||||
</summary>
|
||||
<param name="data"></param>
|
||||
<returns></returns>
|
||||
|
Reference in New Issue
Block a user