mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 调整 增加支持 OneToOne 级联保存,EnableAddOrUpdateNavigateList 改名为 EnableAddOrUpdateNavigate;
This commit is contained in:
		@@ -46,7 +46,7 @@ namespace FreeSql
 | 
				
			|||||||
                    _optionsPriv = new DbContextOptions();
 | 
					                    _optionsPriv = new DbContextOptions();
 | 
				
			||||||
                    if (FreeSqlDbContextExtensions._dicSetDbContextOptions.TryGetValue(OrmOriginal.Ado.Identifier, out var opt))
 | 
					                    if (FreeSqlDbContextExtensions._dicSetDbContextOptions.TryGetValue(OrmOriginal.Ado.Identifier, out var opt))
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        _optionsPriv.EnableAddOrUpdateNavigateList = opt.EnableAddOrUpdateNavigateList;
 | 
					                        _optionsPriv.EnableAddOrUpdateNavigate = opt.EnableAddOrUpdateNavigate;
 | 
				
			||||||
                        _optionsPriv.EnableGlobalFilter = opt.EnableGlobalFilter;
 | 
					                        _optionsPriv.EnableGlobalFilter = opt.EnableGlobalFilter;
 | 
				
			||||||
                        _optionsPriv.NoneParameter = opt.NoneParameter;
 | 
					                        _optionsPriv.NoneParameter = opt.NoneParameter;
 | 
				
			||||||
                        _optionsPriv.OnEntityChange = opt.OnEntityChange;
 | 
					                        _optionsPriv.OnEntityChange = opt.OnEntityChange;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,20 +7,21 @@ namespace FreeSql
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    public class DbContextOptions
 | 
					    public class DbContextOptions
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 是否开启一对多,多对多级联保存功能<para></para>
 | 
					        /// 是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能<para></para>
 | 
				
			||||||
        /// <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>
 | 
				
			||||||
        /// 【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(*注意不会更新)<para></para>
 | 
					        /// 【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新)<para></para>
 | 
				
			||||||
        /// - 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
 | 
					        /// - 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
 | 
				
			||||||
        /// - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
 | 
					        /// - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public bool EnableAddOrUpdateNavigateList { get; set; } = false;
 | 
					        public bool EnableAddOrUpdateNavigate { get; set; } = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 使用无参数化设置(对应 IInsert/IUpdate)
 | 
					        /// 使用无参数化设置(对应 IInsert/IUpdate)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,8 +54,8 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
				
			||||||
                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
					                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
				
			||||||
                            Attach(data);
 | 
					                            Attach(data);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
 | 
					                                await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -65,8 +65,8 @@ namespace FreeSql
 | 
				
			|||||||
                            IncrAffrows(1);
 | 
					                            IncrAffrows(1);
 | 
				
			||||||
                            _db.OrmOriginal.MapEntityValue(_entityType, newval, data);
 | 
					                            _db.OrmOriginal.MapEntityValue(_entityType, newval, data);
 | 
				
			||||||
                            Attach(newval);
 | 
					                            Attach(newval);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
 | 
					                                await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
@@ -78,8 +78,8 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
				
			||||||
                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
					                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
				
			||||||
                            Attach(data);
 | 
					                            Attach(data);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
 | 
					                                await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
@@ -87,8 +87,8 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
 | 
					            EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
 | 
				
			||||||
            Attach(data);
 | 
					            Attach(data);
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken);
 | 
					                await AddOrUpdateNavigateAsync(data, true, null, cancellationToken);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public Task AddAsync(TEntity data, CancellationToken cancellationToken = default) => AddPrivAsync(data, true, cancellationToken);
 | 
					        public Task AddAsync(TEntity data, CancellationToken cancellationToken = default) => AddPrivAsync(data, true, cancellationToken);
 | 
				
			||||||
        async public Task AddRangeAsync(IEnumerable<TEntity> data, CancellationToken cancellationToken = default)
 | 
					        async public Task AddRangeAsync(IEnumerable<TEntity> data, CancellationToken cancellationToken = default)
 | 
				
			||||||
@@ -120,9 +120,9 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
 | 
					                            _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
 | 
				
			||||||
                        IncrAffrows(rets.Count);
 | 
					                        IncrAffrows(rets.Count);
 | 
				
			||||||
                        AttachRange(rets);
 | 
					                        AttachRange(rets);
 | 
				
			||||||
                        if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                        if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                            foreach (var item in data)
 | 
					                            foreach (var item in data)
 | 
				
			||||||
                                await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken);
 | 
					                                await AddOrUpdateNavigateAsync(item, true, null, cancellationToken);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        if (_tableIdentitys.Length == 1)
 | 
					                        if (_tableIdentitys.Length == 1)
 | 
				
			||||||
@@ -138,9 +138,9 @@ namespace FreeSql
 | 
				
			|||||||
            foreach (var item in data)
 | 
					            foreach (var item in data)
 | 
				
			||||||
                EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
 | 
					                EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
 | 
				
			||||||
            AttachRange(data);
 | 
					            AttachRange(data);
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                foreach (var item in data)
 | 
					                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)
 | 
					        async public Task SaveManyAsync(TEntity item, string propertyName, CancellationToken cancellationToken = default)
 | 
				
			||||||
@@ -160,11 +160,11 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            await DbContextFlushCommandAsync(cancellationToken);
 | 
					            await DbContextFlushCommandAsync(cancellationToken);
 | 
				
			||||||
            var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
 | 
					            var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
 | 
				
			||||||
            _db.Options.EnableAddOrUpdateNavigateList = false;
 | 
					            _db.Options.EnableAddOrUpdateNavigate = false;
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                await AddOrUpdateNavigateListAsync(item, false, propertyName, cancellationToken);
 | 
					                await AddOrUpdateNavigateAsync(item, false, propertyName, cancellationToken);
 | 
				
			||||||
                if (tref.RefType == Internal.Model.TableRefType.OneToMany)
 | 
					                if (tref.RefType == Internal.Model.TableRefType.OneToMany)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    await DbContextFlushCommandAsync(cancellationToken);
 | 
					                    await DbContextFlushCommandAsync(cancellationToken);
 | 
				
			||||||
@@ -197,10 +197,10 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            finally
 | 
					            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 =>
 | 
					            Func<PropertyInfo, Task> action = async prop =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -213,15 +213,17 @@ namespace FreeSql
 | 
				
			|||||||
                switch (tref.RefType)
 | 
					                switch (tref.RefType)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    case Internal.Model.TableRefType.OneToOne:
 | 
					                    case Internal.Model.TableRefType.OneToOne:
 | 
				
			||||||
                        //var propValItem = GetItemValue(item, prop);
 | 
					                        refSet = GetDbSetObject(tref.RefEntityType);
 | 
				
			||||||
                        //for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
 | 
					                        var propValItem = GetItemValue(item, prop);
 | 
				
			||||||
                        //{
 | 
					                        if (propValItem == null) return;
 | 
				
			||||||
                        //    var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
 | 
					                        for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
 | 
				
			||||||
                        //    _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
 | 
					                        {
 | 
				
			||||||
                        //}
 | 
					                            var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
 | 
				
			||||||
                        //if (isAdd) await refSet.AddAsync(propValItem);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
 | 
				
			||||||
                        //else await refSet.AddOrUpdateAsync(propValItem);
 | 
					                        }
 | 
				
			||||||
                        //return;
 | 
					                        if (isAdd) await refSet.AddAsync(propValItem);
 | 
				
			||||||
 | 
					                        else await refSet.AddOrUpdateAsync(propValItem);
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
                    case Internal.Model.TableRefType.ManyToOne:
 | 
					                    case Internal.Model.TableRefType.ManyToOne:
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -441,9 +443,9 @@ namespace FreeSql
 | 
				
			|||||||
                state.OldValue = item;
 | 
					                state.OldValue = item;
 | 
				
			||||||
                EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
 | 
					                EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                foreach (var item in data)
 | 
					                foreach (var item in data)
 | 
				
			||||||
                    await AddOrUpdateNavigateListAsync(item, false, null, cancellationToken);
 | 
					                    await AddOrUpdateNavigateAsync(item, false, null, cancellationToken);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,8 +53,8 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
				
			||||||
                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
					                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
				
			||||||
                            Attach(data);
 | 
					                            Attach(data);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                AddOrUpdateNavigateList(data, true, null);
 | 
					                                AddOrUpdateNavigate(data, true, null);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
@@ -64,8 +64,8 @@ namespace FreeSql
 | 
				
			|||||||
                            IncrAffrows(1);
 | 
					                            IncrAffrows(1);
 | 
				
			||||||
                            _db.OrmOriginal.MapEntityValue(_entityType, newval, data);
 | 
					                            _db.OrmOriginal.MapEntityValue(_entityType, newval, data);
 | 
				
			||||||
                            Attach(newval);
 | 
					                            Attach(newval);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                AddOrUpdateNavigateList(data, true, null);
 | 
					                                AddOrUpdateNavigate(data, true, null);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
@@ -77,8 +77,8 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval);
 | 
				
			||||||
                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
					                            _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { Object = data, Type = DbContext.EntityChangeType.Insert });
 | 
				
			||||||
                            Attach(data);
 | 
					                            Attach(data);
 | 
				
			||||||
                            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                                AddOrUpdateNavigateList(data, true, null);
 | 
					                                AddOrUpdateNavigate(data, true, null);
 | 
				
			||||||
                            return;
 | 
					                            return;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
@@ -86,8 +86,8 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
 | 
					            EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data));
 | 
				
			||||||
            Attach(data);
 | 
					            Attach(data);
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                AddOrUpdateNavigateList(data, true, null);
 | 
					                AddOrUpdateNavigate(data, true, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 添加
 | 
					        /// 添加
 | 
				
			||||||
@@ -123,9 +123,9 @@ namespace FreeSql
 | 
				
			|||||||
                            _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
 | 
					                            _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s);
 | 
				
			||||||
                        IncrAffrows(rets.Count);
 | 
					                        IncrAffrows(rets.Count);
 | 
				
			||||||
                        AttachRange(rets);
 | 
					                        AttachRange(rets);
 | 
				
			||||||
                        if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					                        if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                            foreach (var item in data)
 | 
					                            foreach (var item in data)
 | 
				
			||||||
                                AddOrUpdateNavigateList(item, true, null);
 | 
					                                AddOrUpdateNavigate(item, true, null);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    default:
 | 
					                    default:
 | 
				
			||||||
                        if (_tableIdentitys.Length == 1)
 | 
					                        if (_tableIdentitys.Length == 1)
 | 
				
			||||||
@@ -141,9 +141,9 @@ namespace FreeSql
 | 
				
			|||||||
            foreach (var item in data)
 | 
					            foreach (var item in data)
 | 
				
			||||||
                EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
 | 
					                EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item));
 | 
				
			||||||
            AttachRange(data);
 | 
					            AttachRange(data);
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                foreach (var item in data)
 | 
					                foreach (var item in data)
 | 
				
			||||||
                    AddOrUpdateNavigateList(item, true, null);
 | 
					                    AddOrUpdateNavigate(item, true, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
@@ -172,11 +172,11 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            DbContextFlushCommand();
 | 
					            DbContextFlushCommand();
 | 
				
			||||||
            var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
 | 
					            var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
 | 
				
			||||||
            _db.Options.EnableAddOrUpdateNavigateList = false;
 | 
					            _db.Options.EnableAddOrUpdateNavigate = false;
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                AddOrUpdateNavigateList(item, false, propertyName);
 | 
					                AddOrUpdateNavigate(item, false, propertyName);
 | 
				
			||||||
                if (tref.RefType == Internal.Model.TableRefType.OneToMany)
 | 
					                if (tref.RefType == Internal.Model.TableRefType.OneToMany)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    DbContextFlushCommand();
 | 
					                    DbContextFlushCommand();
 | 
				
			||||||
@@ -209,10 +209,10 @@ namespace FreeSql
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            finally
 | 
					            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 =>
 | 
					            Action<PropertyInfo> action = prop =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -225,15 +225,17 @@ namespace FreeSql
 | 
				
			|||||||
                switch (tref.RefType)
 | 
					                switch (tref.RefType)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    case Internal.Model.TableRefType.OneToOne:
 | 
					                    case Internal.Model.TableRefType.OneToOne:
 | 
				
			||||||
                        //var propValItem = GetItemValue(item, prop);
 | 
					                        refSet = GetDbSetObject(tref.RefEntityType);
 | 
				
			||||||
                        //for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
 | 
					                        var propValItem = GetItemValue(item, prop);
 | 
				
			||||||
                        //{
 | 
					                        if (propValItem == null) return;
 | 
				
			||||||
                        //    var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
 | 
					                        for (var colidx = 0; colidx < tref.Columns.Count; colidx++)
 | 
				
			||||||
                        //    _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
 | 
					                        {
 | 
				
			||||||
                        //}
 | 
					                            var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.RefColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName));
 | 
				
			||||||
                        //if (isAdd) refSet.Add(propValItem);
 | 
					                            _db.OrmOriginal.SetEntityValueWithPropertyName(tref.RefEntityType, propValItem, tref.RefColumns[colidx].CsName, val);
 | 
				
			||||||
                        //else refSet.AddOrUpdate(propValItem);
 | 
					                        }
 | 
				
			||||||
                        //return;
 | 
					                        if (isAdd) refSet.Add(propValItem);
 | 
				
			||||||
 | 
					                        else refSet.AddOrUpdate(propValItem);
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
                    case Internal.Model.TableRefType.ManyToOne:
 | 
					                    case Internal.Model.TableRefType.ManyToOne:
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -483,9 +485,9 @@ namespace FreeSql
 | 
				
			|||||||
                state.OldValue = item;
 | 
					                state.OldValue = item;
 | 
				
			||||||
                EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
 | 
					                EnqueueToDbContext(DbContext.EntityChangeType.Update, state);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (_db.Options.EnableAddOrUpdateNavigateList)
 | 
					            if (_db.Options.EnableAddOrUpdateNavigate)
 | 
				
			||||||
                foreach (var item in data)
 | 
					                foreach (var item in data)
 | 
				
			||||||
                    AddOrUpdateNavigateList(item, false, null);
 | 
					                    AddOrUpdateNavigate(item, false, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -603,8 +605,8 @@ namespace FreeSql
 | 
				
			|||||||
            if (data == null) data = _dataEditing;
 | 
					            if (data == null) data = _dataEditing;
 | 
				
			||||||
            var beforeAffrows = 0;
 | 
					            var beforeAffrows = 0;
 | 
				
			||||||
            if (data == null) return 0;
 | 
					            if (data == null) return 0;
 | 
				
			||||||
            var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
 | 
					            var oldEnable = _db.Options.EnableAddOrUpdateNavigate;
 | 
				
			||||||
            _db.Options.EnableAddOrUpdateNavigateList = false;
 | 
					            _db.Options.EnableAddOrUpdateNavigate = false;
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                DbContextFlushCommand();
 | 
					                DbContextFlushCommand();
 | 
				
			||||||
@@ -646,7 +648,7 @@ namespace FreeSql
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                _dataEditing = null;
 | 
					                _dataEditing = null;
 | 
				
			||||||
                _statesEditing.Clear();
 | 
					                _statesEditing.Clear();
 | 
				
			||||||
                _db.Options.EnableAddOrUpdateNavigateList = oldEnable;
 | 
					                _db.Options.EnableAddOrUpdateNavigate = oldEnable;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return _db._affrows - beforeAffrows;
 | 
					            return _db._affrows - beforeAffrows;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -242,7 +242,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
 | 
					        /// 使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="data"></param>
 | 
					        /// <param name="data"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
@@ -263,7 +263,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
 | 
				
			|||||||
                    if (_fsql.Select<object>().AsType(et).Any()) continue;
 | 
					                    if (_fsql.Select<object>().AsType(et).Any()) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    var repo = _fsql.GetRepository<object>();
 | 
					                    var repo = _fsql.GetRepository<object>();
 | 
				
			||||||
                    repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					                    repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
                    repo.DbContextOptions.NoneParameter = true;
 | 
					                    repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
                    repo.AsType(et);
 | 
					                    repo.AsType(et);
 | 
				
			||||||
                    repo.Insert(sd);
 | 
					                    repo.Insert(sd);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -329,7 +329,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
 | 
				
			|||||||
        public EfCoreTableFluent<T> HasData(T data) => HasData(new[] { data });
 | 
					        public EfCoreTableFluent<T> HasData(T data) => HasData(new[] { data });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
 | 
					        /// 使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="data"></param>
 | 
					        /// <param name="data"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
@@ -350,7 +350,7 @@ namespace FreeSql.Extensions.EfCoreFluentApi
 | 
				
			|||||||
                    if (_fsql.Select<object>().AsType(et).Any()) continue;
 | 
					                    if (_fsql.Select<object>().AsType(et).Any()) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    var repo = _fsql.GetRepository<object>();
 | 
					                    var repo = _fsql.GetRepository<object>();
 | 
				
			||||||
                    repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					                    repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
                    repo.DbContextOptions.NoneParameter = true;
 | 
					                    repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
                    repo.AsType(et);
 | 
					                    repo.AsType(et);
 | 
				
			||||||
                    repo.Insert(sd);
 | 
					                    repo.Insert(sd);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,16 +89,18 @@
 | 
				
			|||||||
            刷新队列中的命令
 | 
					            刷新队列中的命令
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigateList">
 | 
					        <member name="P:FreeSql.DbContextOptions.EnableAddOrUpdateNavigate">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            是否开启一对多,多对多级联保存功能<para></para>
 | 
					            是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能<para></para>
 | 
				
			||||||
            <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>
 | 
				
			||||||
            【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(*注意不会更新)<para></para>
 | 
					            【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新)<para></para>
 | 
				
			||||||
            - 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
 | 
					            - 属性集合为空时(!=null),删除他们的所有关联数据(中间表)<para></para>
 | 
				
			||||||
            - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
 | 
					            - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
@@ -230,7 +232,7 @@
 | 
				
			|||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent.HasData(System.Collections.Generic.IEnumerable{System.Object})">
 | 
					        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent.HasData(System.Collections.Generic.IEnumerable{System.Object})">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
 | 
					            使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="data"></param>
 | 
					            <param name="data"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
@@ -243,7 +245,7 @@
 | 
				
			|||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent`1.HasData(System.Collections.Generic.IEnumerable{`0})">
 | 
					        <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreTableFluent`1.HasData(System.Collections.Generic.IEnumerable{`0})">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            使用 Repository + EnableAddOrUpdateNavigateList + NoneParameter 方式插入种子数据
 | 
					            使用 Repository + EnableAddOrUpdateNavigate + NoneParameter 方式插入种子数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="data"></param>
 | 
					            <param name="data"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,18 +15,17 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            var fsql = g.sqlite;
 | 
					            var fsql = g.sqlite;
 | 
				
			||||||
            var groupRepo = fsql.GetRepository<DeleteCascadeUserGroup>();
 | 
					            var groupRepo = fsql.GetRepository<DeleteCascadeUserGroup>();
 | 
				
			||||||
            var userRepo = fsql.GetRepository<DeleteCascadeUser>();
 | 
					            var userRepo = fsql.GetRepository<DeleteCascadeUser>();
 | 
				
			||||||
 | 
					            userRepo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            //OneToOne
 | 
					            //OneToOne
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01" };
 | 
					            var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } };
 | 
				
			||||||
            userRepo.Insert(user);
 | 
					            userRepo.Insert(user);
 | 
				
			||||||
            var userExt = new DeleteCascadeUserExt { UserId = user.Id, Remark = "用户备注01" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt).ExecuteAffrows());
 | 
					 | 
				
			||||||
            var ret = userRepo.DeleteCascade(user);
 | 
					            var ret = userRepo.DeleteCascade(user);
 | 
				
			||||||
            Assert.Equal(2, ret.Count);
 | 
					            Assert.Equal(2, ret.Count);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
				
			||||||
            Assert.Equal(userExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(user.UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUser>(ret[1]);
 | 
					            Assert.IsType<DeleteCascadeUser>(ret[1]);
 | 
				
			||||||
            Assert.Equal(user.Id, (ret[1] as DeleteCascadeUser).Id);
 | 
					            Assert.Equal(user.Id, (ret[1] as DeleteCascadeUser).Id);
 | 
				
			||||||
            Assert.Equal(user.Username, (ret[1] as DeleteCascadeUser).Username);
 | 
					            Assert.Equal(user.Username, (ret[1] as DeleteCascadeUser).Username);
 | 
				
			||||||
@@ -35,15 +34,13 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            //OneToOne 先删除 UserExt
 | 
					            //OneToOne 先删除 UserExt
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01" };
 | 
					            user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } };
 | 
				
			||||||
            userRepo.Insert(user);
 | 
					            userRepo.Insert(user);
 | 
				
			||||||
            userExt = new DeleteCascadeUserExt { UserId = user.Id, Remark = "用户备注01" };
 | 
					            ret = fsql.GetRepository<DeleteCascadeUserExt>().DeleteCascade(user.UserExt);
 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt).ExecuteAffrows());
 | 
					 | 
				
			||||||
            ret = fsql.GetRepository<DeleteCascadeUserExt>().DeleteCascade(userExt);
 | 
					 | 
				
			||||||
            Assert.Equal(2, ret.Count);
 | 
					            Assert.Equal(2, ret.Count);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
				
			||||||
            Assert.Equal(userExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(user.UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(user.UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUser>(ret[0]);
 | 
					            Assert.IsType<DeleteCascadeUser>(ret[0]);
 | 
				
			||||||
            Assert.Equal(user.Id, (ret[0] as DeleteCascadeUser).Id);
 | 
					            Assert.Equal(user.Id, (ret[0] as DeleteCascadeUser).Id);
 | 
				
			||||||
            Assert.Equal(user.Username, (ret[0] as DeleteCascadeUser).Username);
 | 
					            Assert.Equal(user.Username, (ret[0] as DeleteCascadeUser).Username);
 | 
				
			||||||
@@ -53,38 +50,32 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            fsql.Delete<DeleteCascadeUserGroup>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUserGroup>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            groupRepo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            groupRepo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            var group = new DeleteCascadeUserGroup
 | 
					            var group = new DeleteCascadeUserGroup
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                GroupName = "group01",
 | 
					                GroupName = "group01",
 | 
				
			||||||
                Users = new List<DeleteCascadeUser>
 | 
					                Users = new List<DeleteCascadeUser>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin01", Password = "pwd01" },
 | 
					                    new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } },
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin02", Password = "pwd02" },
 | 
					                    new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" } },
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin03", Password = "pwd03" },
 | 
					                    new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" } },
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            groupRepo.Insert(group);
 | 
					            groupRepo.Insert(group);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[0].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[0].GroupId);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[1].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[1].GroupId);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[2].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[2].GroupId);
 | 
				
			||||||
            var userExt0 = new DeleteCascadeUserExt { UserId = group.Users[0].Id, Remark = "用户备注01" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt0).ExecuteAffrows());
 | 
					 | 
				
			||||||
            var userExt1 = new DeleteCascadeUserExt { UserId = group.Users[1].Id, Remark = "用户备注02" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt1).ExecuteAffrows());
 | 
					 | 
				
			||||||
            var userExt2 = new DeleteCascadeUserExt { UserId = group.Users[2].Id, Remark = "用户备注03" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt2).ExecuteAffrows());
 | 
					 | 
				
			||||||
            ret = groupRepo.DeleteCascade(group);
 | 
					            ret = groupRepo.DeleteCascade(group);
 | 
				
			||||||
            Assert.Equal(7, ret.Count);
 | 
					            Assert.Equal(7, ret.Count);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
				
			||||||
            Assert.Equal(userExt0.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt0.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
				
			||||||
            Assert.Equal(userExt1.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt1.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[2]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[2]);
 | 
				
			||||||
            Assert.Equal(userExt2.UserId, (ret[2] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt2.Remark, (ret[2] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUser>(ret[3]);
 | 
					            Assert.IsType<DeleteCascadeUser>(ret[3]);
 | 
				
			||||||
            Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUser).Id);
 | 
					            Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUser).Id);
 | 
				
			||||||
            Assert.Equal(group.Users[0].Username, (ret[3] as DeleteCascadeUser).Username);
 | 
					            Assert.Equal(group.Users[0].Username, (ret[3] as DeleteCascadeUser).Username);
 | 
				
			||||||
@@ -118,39 +109,33 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                new DeleteCascadeTag { TagName = "tag08" },
 | 
					                new DeleteCascadeTag { TagName = "tag08" },
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            fsql.GetRepository<DeleteCascadeTag>().Insert(tags);
 | 
					            fsql.GetRepository<DeleteCascadeTag>().Insert(tags);
 | 
				
			||||||
            groupRepo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            groupRepo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            group = new DeleteCascadeUserGroup
 | 
					            group = new DeleteCascadeUserGroup
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                GroupName = "group01",
 | 
					                GroupName = "group01",
 | 
				
			||||||
                Users = new List<DeleteCascadeUser>
 | 
					                Users = new List<DeleteCascadeUser>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin01", Password = "pwd01", Tags = new List<DeleteCascadeTag> { tags[0], tags[2], tags[3], tags[6] } },
 | 
					                    new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" }, Tags = new List<DeleteCascadeTag> { tags[0], tags[2], tags[3], tags[6] } },
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin02", Password = "pwd02", Tags = new List<DeleteCascadeTag> { tags[1], tags[2], tags[5] } },
 | 
					                    new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" }, Tags = new List<DeleteCascadeTag> { tags[1], tags[2], tags[5] } },
 | 
				
			||||||
                    new DeleteCascadeUser { Username = "admin03", Password = "pwd03", Tags = new List<DeleteCascadeTag> { tags[3], tags[4], tags[6], tags[7] } },
 | 
					                    new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" }, Tags = new List<DeleteCascadeTag> { tags[3], tags[4], tags[6], tags[7] } },
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            groupRepo.Insert(group);
 | 
					            groupRepo.Insert(group);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[0].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[0].GroupId);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[1].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[1].GroupId);
 | 
				
			||||||
            Assert.Equal(group.Id, group.Users[2].GroupId);
 | 
					            Assert.Equal(group.Id, group.Users[2].GroupId);
 | 
				
			||||||
            userExt0 = new DeleteCascadeUserExt { UserId = group.Users[0].Id, Remark = "用户备注01" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt0).ExecuteAffrows());
 | 
					 | 
				
			||||||
            userExt1 = new DeleteCascadeUserExt { UserId = group.Users[1].Id, Remark = "用户备注02" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt1).ExecuteAffrows());
 | 
					 | 
				
			||||||
            userExt2 = new DeleteCascadeUserExt { UserId = group.Users[2].Id, Remark = "用户备注03" };
 | 
					 | 
				
			||||||
            Assert.Equal(1, fsql.Insert(userExt2).ExecuteAffrows());
 | 
					 | 
				
			||||||
            ret = groupRepo.DeleteCascade(group);
 | 
					            ret = groupRepo.DeleteCascade(group);
 | 
				
			||||||
            Assert.Equal(18, ret.Count);
 | 
					            Assert.Equal(18, ret.Count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[0]);
 | 
				
			||||||
            Assert.Equal(userExt0.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt0.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[1]);
 | 
				
			||||||
            Assert.Equal(userExt1.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt1.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserExt>(ret[2]);
 | 
					            Assert.IsType<DeleteCascadeUserExt>(ret[2]);
 | 
				
			||||||
            Assert.Equal(userExt2.UserId, (ret[2] as DeleteCascadeUserExt).UserId);
 | 
					            Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId);
 | 
				
			||||||
            Assert.Equal(userExt2.Remark, (ret[2] as DeleteCascadeUserExt).Remark);
 | 
					            Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Assert.IsType<DeleteCascadeUserTag>(ret[3]);
 | 
					            Assert.IsType<DeleteCascadeUserTag>(ret[3]);
 | 
				
			||||||
            Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUserTag).UserId);
 | 
					            Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUserTag).UserId);
 | 
				
			||||||
@@ -480,10 +465,10 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void EnableAddOrUpdateNavigateList_OneToMany()
 | 
					        public void EnableAddOrUpdateNavigate_OneToMany()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<Cagetory>();
 | 
					            var repo = g.sqlite.GetRepository<Cagetory>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            var cts = new[] {
 | 
					            var cts = new[] {
 | 
				
			||||||
                new Cagetory
 | 
					                new Cagetory
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -543,10 +528,10 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void EnableAddOrUpdateNavigateList_OneToMany_lazyloading()
 | 
					        public void EnableAddOrUpdateNavigate_OneToMany_lazyloading()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<CagetoryLD>();
 | 
					            var repo = g.sqlite.GetRepository<CagetoryLD>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            var cts = new[] {
 | 
					            var cts = new[] {
 | 
				
			||||||
                new CagetoryLD
 | 
					                new CagetoryLD
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -615,7 +600,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        public void SaveMany_OneToMany()
 | 
					        public void SaveMany_OneToMany()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<Cagetory>();
 | 
					            var repo = g.sqlite.GetRepository<Cagetory>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //关闭级联保存功能
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = false; //关闭级联保存功能
 | 
				
			||||||
            var cts = new[] {
 | 
					            var cts = new[] {
 | 
				
			||||||
                new Cagetory
 | 
					                new Cagetory
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -664,7 +649,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void EnableAddOrUpdateNavigateList_OneToMany_Parent()
 | 
					        public void EnableAddOrUpdateNavigate_OneToMany_Parent()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            g.sqlite.Delete<CagetoryParent>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlite.Delete<CagetoryParent>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<CagetoryParent>();
 | 
					            var repo = g.sqlite.GetRepository<CagetoryParent>();
 | 
				
			||||||
@@ -689,7 +674,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                    })
 | 
					                    })
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //打开级联保存功能
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true; //打开级联保存功能
 | 
				
			||||||
            repo.Insert(cts);
 | 
					            repo.Insert(cts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var notreelist1 = repo.Select.ToList();
 | 
					            var notreelist1 = repo.Select.ToList();
 | 
				
			||||||
@@ -722,7 +707,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void EnableAddOrUpdateNavigateList_ManyToMany()
 | 
					        public void EnableAddOrUpdateNavigate_ManyToMany()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var tags = new[] {
 | 
					            var tags = new[] {
 | 
				
			||||||
                new Tag { TagName = "流行" },
 | 
					                new Tag { TagName = "流行" },
 | 
				
			||||||
@@ -750,7 +735,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<Song>();
 | 
					            var repo = g.sqlite.GetRepository<Song>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //打开级联保存功能
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true; //打开级联保存功能
 | 
				
			||||||
            repo.Insert(ss);
 | 
					            repo.Insert(ss);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ss[0].Tags[0].TagName = "流行101";
 | 
					            ss[0].Tags[0].TagName = "流行101";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
using FreeSql.DataAnnotations;
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
using FreeSql;
 | 
					using FreeSql;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
@@ -75,7 +75,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                tags.Add(new Tag
 | 
					                tags.Add(new Tag
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Ddd = DateTime.Now.Second,
 | 
					                    Ddd = DateTime.Now.Second,
 | 
				
			||||||
                    Name = "test_manytoMany_01_<EFBFBD>й<EFBFBD>2234234"
 | 
					                    Name = "test_manytoMany_01_中国2234234"
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
                tags[0].Name = "123123";
 | 
					                tags[0].Name = "123123";
 | 
				
			||||||
                tags.RemoveAt(1);
 | 
					                tags.RemoveAt(1);
 | 
				
			||||||
@@ -99,36 +99,36 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                var tag1 = new Tag
 | 
					                var tag1 = new Tag
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Ddd = DateTime.Now.Second,
 | 
					                    Ddd = DateTime.Now.Second,
 | 
				
			||||||
                    Name = "test_manytoMany_01_<EFBFBD>й<EFBFBD>"
 | 
					                    Name = "test_manytoMany_01_中国"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var tag2 = new Tag
 | 
					                var tag2 = new Tag
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Ddd = DateTime.Now.Second,
 | 
					                    Ddd = DateTime.Now.Second,
 | 
				
			||||||
                    Name = "test_manytoMany_02_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
 | 
					                    Name = "test_manytoMany_02_美国"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var tag3 = new Tag
 | 
					                var tag3 = new Tag
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Ddd = DateTime.Now.Second,
 | 
					                    Ddd = DateTime.Now.Second,
 | 
				
			||||||
                    Name = "test_manytoMany_03_<EFBFBD>ձ<EFBFBD>"
 | 
					                    Name = "test_manytoMany_03_日本"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                ctx.AddRange(new[] { tag1, tag2, tag3 });
 | 
					                ctx.AddRange(new[] { tag1, tag2, tag3 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var song1 = new Song
 | 
					                var song1 = new Song
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Create_time = DateTime.Now,
 | 
					                    Create_time = DateTime.Now,
 | 
				
			||||||
                    Title = "test_manytoMany_01_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>.mp3",
 | 
					                    Title = "test_manytoMany_01_我是中国人.mp3",
 | 
				
			||||||
                    Url = "http://ww.baidu.com/"
 | 
					                    Url = "http://ww.baidu.com/"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var song2 = new Song
 | 
					                var song2 = new Song
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Create_time = DateTime.Now,
 | 
					                    Create_time = DateTime.Now,
 | 
				
			||||||
                    Title = "test_manytoMany_02_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.mp3",
 | 
					                    Title = "test_manytoMany_02_爱你一万年.mp3",
 | 
				
			||||||
                    Url = "http://ww.163.com/"
 | 
					                    Url = "http://ww.163.com/"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var song3 = new Song
 | 
					                var song3 = new Song
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Create_time = DateTime.Now,
 | 
					                    Create_time = DateTime.Now,
 | 
				
			||||||
                    Title = "test_manytoMany_03_ǧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>.mp3",
 | 
					                    Title = "test_manytoMany_03_千年等一回.mp3",
 | 
				
			||||||
                    Url = "http://ww.sina.com/"
 | 
					                    Url = "http://ww.sina.com/"
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                ctx.AddRange(new[] { song1, song2, song3 });
 | 
					                ctx.AddRange(new[] { song1, song2, song3 });
 | 
				
			||||||
@@ -155,7 +155,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.sqlite.SetDbContextOptions(opt =>
 | 
					            g.sqlite.SetDbContextOptions(opt =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                //opt.EnableAddOrUpdateNavigateList = false;
 | 
					                //opt.EnableAddOrUpdateNavigate = false;
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.mysql.Insert<testenumWhere>().AppendData(new testenumWhere { type = testenumWhereType.Blaaa }).ExecuteAffrows();
 | 
					            g.mysql.Insert<testenumWhere>().AppendData(new testenumWhere { type = testenumWhereType.Blaaa }).ExecuteAffrows();
 | 
				
			||||||
@@ -163,11 +163,11 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            var sql = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToSql();
 | 
					            var sql = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToSql();
 | 
				
			||||||
            var tolist = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToList();
 | 
					            var tolist = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            //֧<EFBFBD><EFBFBD> 1<>Զ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					            //支持 1对多 级联保存
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var ctx = g.sqlite.CreateDbContext())
 | 
					            using (var ctx = g.sqlite.CreateDbContext())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                ctx.Options.EnableAddOrUpdateNavigateList = true;
 | 
					                ctx.Options.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
                var tags = ctx.Set<Tag>().Select.IncludeMany(a => a.Tags).ToList();
 | 
					                var tags = ctx.Set<Tag>().Select.IncludeMany(a => a.Tags).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var tag = new Tag
 | 
					                var tag = new Tag
 | 
				
			||||||
@@ -195,11 +195,11 @@ namespace FreeSql.Tests
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Update()
 | 
					        public void Update()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            //<EFBFBD><EFBFBD>ѯ 1<>Զ࣬<D4B6>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					            //查询 1对多,再级联保存
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var ctx = g.sqlite.CreateDbContext())
 | 
					            using (var ctx = g.sqlite.CreateDbContext())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                ctx.Options.EnableAddOrUpdateNavigateList = true;
 | 
					                ctx.Options.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
                var tag = ctx.Set<Tag>().Select.First();
 | 
					                var tag = ctx.Set<Tag>().Select.First();
 | 
				
			||||||
                tag.Tags.Add(new Tag { Name = "sub3" });
 | 
					                tag.Tags.Add(new Tag { Name = "sub3" });
 | 
				
			||||||
                tag.Name = Guid.NewGuid().ToString();
 | 
					                tag.Name = Guid.NewGuid().ToString();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -191,7 +191,7 @@ WHERE (exists(SELECT 1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.gbase.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.gbase.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.gbase.GetRepository<District>();
 | 
					            var repo = g.gbase.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1704,7 +1704,7 @@ WHERE (((cast(a.Id as varchar(8000))) in ( SELECT * FROM (SELECT FIRST 10 b.Titl
 | 
				
			|||||||
            var fsql = g.gbase;
 | 
					            var fsql = g.gbase;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -384,7 +384,7 @@ WHERE (((a.`Name`) in (SELECT s.`Title` as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.mysql.GetRepository<District>();
 | 
					            var repo = g.mysql.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -2001,7 +2001,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
 | 
				
			|||||||
            var fsql = g.mysql;
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,7 @@ namespace FreeSql.Tests.Odbc.Dameng
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.dameng.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.dameng.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.dameng.GetRepository<District>();
 | 
					            var repo = g.dameng.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1728,7 +1728,7 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.dameng;
 | 
					            var fsql = g.dameng;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -185,7 +185,7 @@ namespace FreeSql.Tests.Odbc.Default
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.odbc.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.odbc.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.odbc.GetRepository<District>();
 | 
					            var repo = g.odbc.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1517,7 +1517,7 @@ WHERE (((cast(a.[Id] as nvarchar)) in (SELECT b.[Title]
 | 
				
			|||||||
            var fsql = g.odbc;
 | 
					            var fsql = g.odbc;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,7 @@ namespace FreeSql.Tests.Odbc.KingbaseES
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.kingbaseES.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.kingbaseES.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.kingbaseES.GetRepository<District>();
 | 
					            var repo = g.kingbaseES.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1677,7 +1677,7 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.kingbaseES;
 | 
					            var fsql = g.kingbaseES;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -294,7 +294,7 @@ namespace FreeSql.Tests.Odbc.MySql
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.mysql.GetRepository<District>();
 | 
					            var repo = g.mysql.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1881,7 +1881,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
 | 
				
			|||||||
            var fsql = g.mysql;
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,7 @@ namespace FreeSql.Tests.Odbc.Oracle
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.oracle.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.oracle.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.oracle.GetRepository<District>();
 | 
					            var repo = g.oracle.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1720,7 +1720,7 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.oracle;
 | 
					            var fsql = g.oracle;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -270,7 +270,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.pgsql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.pgsql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.pgsql.GetRepository<District>();
 | 
					            var repo = g.pgsql.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1780,7 +1780,7 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
 | 
				
			|||||||
            var fsql = g.pgsql;
 | 
					            var fsql = g.pgsql;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
using FreeSql.DataAnnotations;
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
@@ -184,7 +184,7 @@ namespace FreeSql.Tests.Odbc.SqlServer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.sqlserver.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlserver.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.sqlserver.GetRepository<District>();
 | 
					            var repo = g.sqlserver.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1666,7 +1666,7 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title]
 | 
				
			|||||||
            var fsql = g.sqlserver;
 | 
					            var fsql = g.sqlserver;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -532,7 +532,7 @@ WHERE ROWNUM < 11";
 | 
				
			|||||||
            ).ToSql();
 | 
					            ).ToSql();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.mysql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = true);
 | 
					            g.mysql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigate = true);
 | 
				
			||||||
            var trepo = g.mysql.GetGuidRepository<TaskBuild>();
 | 
					            var trepo = g.mysql.GetGuidRepository<TaskBuild>();
 | 
				
			||||||
            trepo.Insert(new TaskBuild
 | 
					            trepo.Insert(new TaskBuild
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
using FreeSql.DataAnnotations;
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
using FreeSql.Internal.Model;
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
using Newtonsoft.Json;
 | 
					using Newtonsoft.Json;
 | 
				
			||||||
using Newtonsoft.Json.Linq;
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
@@ -234,7 +234,7 @@ namespace FreeSql.Tests.Sqlite
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.sqlite.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlite.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<District>();
 | 
					            var repo = g.sqlite.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -2072,7 +2072,7 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
 | 
				
			|||||||
            var fsql = g.sqlite;
 | 
					            var fsql = g.sqlite;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -309,7 +309,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.dameng.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.dameng.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.dameng.GetRepository<District>();
 | 
					            var repo = g.dameng.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1867,7 +1867,7 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.dameng;
 | 
					            var fsql = g.dameng;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -309,7 +309,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.firebird.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.firebird.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.firebird.GetRepository<District>();
 | 
					            var repo = g.firebird.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1834,7 +1834,7 @@ WHERE (((cast(a.""ID"" as blob sub_type 1)) in (SELECT FIRST 10 b.""TITLE""
 | 
				
			|||||||
            var fsql = g.firebird;
 | 
					            var fsql = g.firebird;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,7 +194,7 @@ namespace FreeSql.Tests.KingbaseES
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.kingbaseES.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.kingbaseES.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.kingbaseES.GetRepository<District>();
 | 
					            var repo = g.kingbaseES.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1681,7 +1681,7 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.kingbaseES;
 | 
					            var fsql = g.kingbaseES;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,7 +59,7 @@ namespace FreeSql.Tests.Linq
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            var repo = fsql.GetRepository<qt01>();
 | 
					            var repo = fsql.GetRepository<qt01>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(sd);
 | 
					            repo.Insert(sd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Assert.True(fsql.Select<qt01>().AsQueryable().Any());
 | 
					            Assert.True(fsql.Select<qt01>().AsQueryable().Any());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -300,7 +300,7 @@ WHERE (((a.[Name]) in (SELECT s.[Title] as as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.msaccess.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.msaccess.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.msaccess.GetRepository<District>();
 | 
					            var repo = g.msaccess.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1645,7 +1645,7 @@ WHERE (((cstr(a.[Id])) in (SELECT TOP 10 b.[Title]
 | 
				
			|||||||
            var fsql = g.msaccess;
 | 
					            var fsql = g.msaccess;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -427,7 +427,7 @@ WHERE (((a.`Name`) in (SELECT s.`Title` as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.mysql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.mysql.GetRepository<District>();
 | 
					            var repo = g.mysql.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -2090,7 +2090,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
 | 
				
			|||||||
            var fsql = g.mysql;
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -309,7 +309,7 @@ WHERE (((a.""NAME"") in (SELECT s.""TITLE"" as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.oracle.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.oracle.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.oracle.GetRepository<District>();
 | 
					            var repo = g.oracle.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1843,7 +1843,7 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.oracle;
 | 
					            var fsql = g.oracle;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -401,7 +401,7 @@ WHERE (((a.""name"") in (SELECT s.""title"" as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.pgsql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.pgsql.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.pgsql.GetRepository<District>();
 | 
					            var repo = g.pgsql.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1927,7 +1927,7 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
 | 
				
			|||||||
            var fsql = g.pgsql;
 | 
					            var fsql = g.pgsql;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -270,7 +270,7 @@ namespace FreeSql.Tests.ShenTong
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.shentong.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.shentong.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.shentong.GetRepository<District>();
 | 
					            var repo = g.shentong.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1789,7 +1789,7 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
 | 
				
			|||||||
            var fsql = g.shentong;
 | 
					            var fsql = g.shentong;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -306,7 +306,7 @@ WHERE (((a.[Name]) in (SELECT s.[Title] as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.sqlserver.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlserver.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.sqlserver.GetRepository<District>();
 | 
					            var repo = g.sqlserver.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -1910,7 +1910,7 @@ INNER JOIN [TestTypeInfo] a__Type With(NoLock) ON a__Type.[Guid] = a.[Id]", sql2
 | 
				
			|||||||
            var fsql = g.sqlserver;
 | 
					            var fsql = g.sqlserver;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -354,7 +354,7 @@ WHERE (((a.""Name"") in (SELECT s.""Title"" as1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            g.sqlite.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlite.Delete<District>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = g.sqlite.GetRepository<District>();
 | 
					            var repo = g.sqlite.GetRepository<District>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new District
 | 
					            repo.Insert(new District
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Code = "001",
 | 
					                Code = "001",
 | 
				
			||||||
@@ -2217,7 +2217,7 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
 | 
				
			|||||||
            var fsql = g.sqlite;
 | 
					            var fsql = g.sqlite;
 | 
				
			||||||
            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<BaseDistrict>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var repo = fsql.GetRepository<VM_District_Child>();
 | 
					            var repo = fsql.GetRepository<VM_District_Child>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.DbContextOptions.NoneParameter = true;
 | 
					            repo.DbContextOptions.NoneParameter = true;
 | 
				
			||||||
            repo.Insert(new VM_District_Child
 | 
					            repo.Insert(new VM_District_Child
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -830,7 +830,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            ).ToSql();
 | 
					            ).ToSql();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.sqlite.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = true);
 | 
					            g.sqlite.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigate = true);
 | 
				
			||||||
            var trepo = g.sqlite.GetGuidRepository<TaskBuild>();
 | 
					            var trepo = g.sqlite.GetGuidRepository<TaskBuild>();
 | 
				
			||||||
            trepo.Insert(new TaskBuild
 | 
					            trepo.Insert(new TaskBuild
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -1146,7 +1146,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var repo = g.mysql.GetRepository<Order>();
 | 
					            var repo = g.mysql.GetRepository<Order>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(neworder);
 | 
					            repo.Insert(neworder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var order = g.mysql.Select<Order>().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表
 | 
					            var order = g.mysql.Select<Order>().Where(a => a.Id == neworder.Id).ToOne(); //查询订单表
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -210,7 +210,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
            g.sqlite.Delete<tcate01>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlite.Delete<tcate01>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            g.sqlite.Delete<tshop01>().Where("1=1").ExecuteAffrows();
 | 
					            g.sqlite.Delete<tshop01>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
            var tshoprepo = g.sqlite.GetRepository<tcate01>();
 | 
					            var tshoprepo = g.sqlite.GetRepository<tcate01>();
 | 
				
			||||||
            tshoprepo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            tshoprepo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            tshoprepo.Insert(new tcate01[]
 | 
					            tshoprepo.Insert(new tcate01[]
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                new tcate01 { name = "tcate1", tshops = new List<tshop01>{ new tshop01(), new tshop01(), new tshop01() } },
 | 
					                new tcate01 { name = "tcate1", tshops = new List<tshop01>{ new tshop01(), new tshop01(), new tshop01() } },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -304,7 +304,7 @@ GROUP BY a.""code"", a.""seqid"", a.""name""", sql);
 | 
				
			|||||||
            fsql.Delete<ts_otm_ll_02>().Where("1=1").ExecuteAffrows();
 | 
					            fsql.Delete<ts_otm_ll_02>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var repo = fsql.GetRepository<ts_otm_ll_01>();
 | 
					            var repo = fsql.GetRepository<ts_otm_ll_01>();
 | 
				
			||||||
            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					            repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
            repo.Insert(new ts_otm_ll_01
 | 
					            repo.Insert(new ts_otm_ll_01
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                name = "001",
 | 
					                name = "001",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,7 +50,7 @@ namespace FreeSql.MySql.Curd
 | 
				
			|||||||
                catch (Exception ex)
 | 
					                catch (Exception ex)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    exception = ex;
 | 
					                    exception = ex;
 | 
				
			||||||
                    throw ex;
 | 
					                    throw;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                finally
 | 
					                finally
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -101,7 +101,7 @@ namespace FreeSql.MySql.Curd
 | 
				
			|||||||
                catch (Exception ex)
 | 
					                catch (Exception ex)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    exception = ex;
 | 
					                    exception = ex;
 | 
				
			||||||
                    throw ex;
 | 
					                    throw;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                finally
 | 
					                finally
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@ namespace FreeSql.Sqlite.Curd
 | 
				
			|||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                exception = ex;
 | 
					                exception = ex;
 | 
				
			||||||
                throw ex;
 | 
					                throw;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            finally
 | 
					            finally
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -81,7 +81,7 @@ namespace FreeSql.Sqlite.Curd
 | 
				
			|||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                exception = ex;
 | 
					                exception = ex;
 | 
				
			||||||
                throw ex;
 | 
					                throw;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            finally
 | 
					            finally
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,7 +132,7 @@ fsql.Select<Song>().OrderBy(a => Guid.NewGuid()).Limit(10).ToList();
 | 
				
			|||||||
[Transactional]
 | 
					[Transactional]
 | 
				
			||||||
public void Add() {
 | 
					public void Add() {
 | 
				
			||||||
  var repo = ioc.GetService<BaseRepository<Tag>>();
 | 
					  var repo = ioc.GetService<BaseRepository<Tag>>();
 | 
				
			||||||
  repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					  repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  var item = new Tag {
 | 
					  var item = new Tag {
 | 
				
			||||||
    Name = "testaddsublist",
 | 
					    Name = "testaddsublist",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,7 +135,7 @@ fsql.Select<Song>().OrderBy(a => Guid.NewGuid()).Limit(10).ToList();
 | 
				
			|||||||
[Transactional]
 | 
					[Transactional]
 | 
				
			||||||
public void Add() {
 | 
					public void Add() {
 | 
				
			||||||
  var repo = ioc.GetService<BaseRepository<Tag>>();
 | 
					  var repo = ioc.GetService<BaseRepository<Tag>>();
 | 
				
			||||||
  repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
 | 
					  repo.DbContextOptions.EnableAddOrUpdateNavigate = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  var item = new Tag {
 | 
					  var item = new Tag {
 | 
				
			||||||
    Name = "testaddsublist",
 | 
					    Name = "testaddsublist",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user