diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index bce37fb8..5aaa2b44 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -34,9 +34,12 @@ namespace FreeSql set => _optionsPriv = value; get { - if (_optionsPriv != null) return _optionsPriv; - if (FreeSqlDbContextExtensions._dicSetDbContextOptions.TryGetValue(Orm, out _optionsPriv)) return _optionsPriv; - _optionsPriv = new DbContextOptions(); + if (_optionsPriv == null) + { + _optionsPriv = new DbContextOptions(); + if (FreeSqlDbContextExtensions._dicSetDbContextOptions.TryGetValue(Orm, out var opt)) + _optionsPriv.EnableAddOrUpdateNavigateList = opt.EnableAddOrUpdateNavigateList; + } return _optionsPriv; } } diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index fbbbaa7c..4500ae9b 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -128,6 +128,14 @@ namespace FreeSql return this; } + Dictionary> _dicDbSetObjects = new Dictionary>(); + DbSet GetDbSetObject(Type et) + { + if (_dicDbSetObjects.TryGetValue(et, out var tryds)) return tryds; + _dicDbSetObjects.Add(et, tryds = _db.Set().AsType(et)); + return tryds; + } + public class EntityState { public EntityState(TEntity value, string key) diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index dd385d01..a283061c 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -47,7 +47,7 @@ namespace FreeSql _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - await AddOrUpdateNavigateListAsync(data); + await AddOrUpdateNavigateListAsync(data, true); } else { @@ -57,7 +57,7 @@ namespace FreeSql _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); if (_db.Options.EnableAddOrUpdateNavigateList) - await AddOrUpdateNavigateListAsync(data); + await AddOrUpdateNavigateListAsync(data, true); } return; default: @@ -69,7 +69,7 @@ namespace FreeSql _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - await AddOrUpdateNavigateListAsync(data); + await AddOrUpdateNavigateListAsync(data, true); } return; } @@ -77,7 +77,7 @@ namespace FreeSql EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data)); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - await AddOrUpdateNavigateListAsync(data); + await AddOrUpdateNavigateListAsync(data, true); } public Task AddAsync(TEntity data) => AddPrivAsync(data, true); async public Task AddRangeAsync(IEnumerable data) @@ -107,7 +107,7 @@ namespace FreeSql AttachRange(rets); if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - await AddOrUpdateNavigateListAsync(item); + await AddOrUpdateNavigateListAsync(item, true); return; default: foreach (var s in data) @@ -123,10 +123,10 @@ namespace FreeSql AttachRange(data); if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - await AddOrUpdateNavigateListAsync(item); + await AddOrUpdateNavigateListAsync(item, true); } } - async Task AddOrUpdateNavigateListAsync(TEntity item) + async Task AddOrUpdateNavigateListAsync(TEntity item, bool isAdd) { Type itemType = null; foreach (var prop in _table.Properties) @@ -164,7 +164,7 @@ namespace FreeSql var propValEach = propVal as IEnumerable; if (propValEach == null) continue; - DbSet refSet = _db.Set().AsType(tref.RefEntityType); + DbSet refSet = GetDbSetObject(tref.RefEntityType); switch (tref.RefType) { case Internal.Model.TableRefType.ManyToMany: @@ -197,10 +197,16 @@ namespace FreeSql } else //保存 { - var midSet = _db.Set().AsType(tref.RefMiddleEntityType); - var midSelect = midSet.Select; - foreach (var midWhere in midWheres) midSelect.Where(midWhere); - var midList = await midSelect.ToListAsync(); + var midSet = GetDbSetObject(tref.RefMiddleEntityType); + List midList = null; + if (isAdd == false) + { + var midSelect = midSet.Select; + foreach (var midWhere in midWheres) midSelect.Where(midWhere); + midList = await midSelect.ToListAsync(); + } + else + midList = new List(); var midListDel = new List(); var midListAdd = new List(); @@ -350,7 +356,7 @@ namespace FreeSql } if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - await AddOrUpdateNavigateListAsync(item); + await AddOrUpdateNavigateListAsync(item, false); } #endregion diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 8e0a7729..9d2b46be 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -47,7 +47,7 @@ namespace FreeSql _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - AddOrUpdateNavigateList(data); + AddOrUpdateNavigateList(data, true); } else { @@ -57,7 +57,7 @@ namespace FreeSql _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); if (_db.Options.EnableAddOrUpdateNavigateList) - AddOrUpdateNavigateList(data); + AddOrUpdateNavigateList(data, true); } return; default: @@ -69,7 +69,7 @@ namespace FreeSql _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - AddOrUpdateNavigateList(data); + AddOrUpdateNavigateList(data, true); } return; } @@ -77,7 +77,7 @@ namespace FreeSql EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data)); Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) - AddOrUpdateNavigateList(data); + AddOrUpdateNavigateList(data, true); } /// /// 添加 @@ -111,7 +111,7 @@ namespace FreeSql AttachRange(rets); if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - AddOrUpdateNavigateList(item); + AddOrUpdateNavigateList(item, true); return; default: foreach (var s in data) @@ -127,11 +127,16 @@ namespace FreeSql AttachRange(data); if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - AddOrUpdateNavigateList(item); + AddOrUpdateNavigateList(item, true); } } static ConcurrentDictionary> _dicLazyIsSetField = new ConcurrentDictionary>(); - void AddOrUpdateNavigateList(TEntity item) + /// + /// 联级保存导航集合 + /// + /// 实体对象 + /// 是否为新增的实体对象 + void AddOrUpdateNavigateList(TEntity item, bool isAdd) { Type itemType = null; foreach (var prop in _table.Properties) @@ -169,7 +174,7 @@ namespace FreeSql var propValEach = propVal as IEnumerable; if (propValEach == null) continue; - DbSet refSet = _db.Set().AsType(tref.RefEntityType); + DbSet refSet = GetDbSetObject(tref.RefEntityType); switch (tref.RefType) { case Internal.Model.TableRefType.ManyToMany: @@ -202,10 +207,16 @@ namespace FreeSql } else //保存 { - var midSet = _db.Set().AsType(tref.RefMiddleEntityType); - var midSelect = midSet.Select; - foreach (var midWhere in midWheres) midSelect.Where(midWhere); - var midList = midSelect.ToList(); + var midSet = GetDbSetObject(tref.RefMiddleEntityType); + List midList = null; + if (isAdd == false) + { + var midSelect = midSet.Select; + foreach (var midWhere in midWheres) midSelect.Where(midWhere); + midList = midSelect.ToList(); + } + else + midList = new List(); var midListDel = new List(); var midListAdd = new List(); @@ -361,7 +372,7 @@ namespace FreeSql } if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - AddOrUpdateNavigateList(item); + AddOrUpdateNavigateList(item, false); } #endregion diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 755141c4..dad2ddeb 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -90,6 +90,13 @@ + + + 联级保存导航集合 + + 实体对象 + 是否为新增的实体对象 + 更新