diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs index a3fa6cbf..516fdbd9 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs @@ -143,6 +143,19 @@ namespace FreeSql this.Repository.UnitOfWork = UnitOfWork.Current.Value; return this.Repository.InsertOrUpdate(this as TEntity); } + + /// + /// 【完整】保存导航属性,子表 + /// + /// 导航属性名 + public virtual void SaveMany(string navigatePropertyName) + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + this.Repository.UnitOfWork = UnitOfWork.Current.Value; + this.Repository.SaveMany(this as TEntity, navigatePropertyName); + } } } diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs index e9b33458..0d412cdb 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityAsync.cs @@ -125,6 +125,19 @@ namespace FreeSql this.Repository.UnitOfWork = UnitOfWork.Current.Value; return this.Repository.InsertOrUpdateAsync(this as TEntity); } + + /// + /// 【完整】保存导航属性,子表 + /// + /// 导航属性名 + public virtual Task SaveManyAsync(string navigatePropertyName) + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + this.Repository.UnitOfWork = UnitOfWork.Current.Value; + return this.Repository.SaveManyAsync(this as TEntity, navigatePropertyName); + } } } diff --git a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs index 03bfa3a9..41742013 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/Net40/BaseEntity.cs @@ -104,6 +104,18 @@ namespace FreeSql return this.Repository.InsertOrUpdate(this as TEntity); } + + /// + /// 【完整】保存导航属性,子表 + /// + /// 导航属性名 + public virtual void SaveMany(string navigatePropertyName) + { + if (this.Repository == null) + this.Repository = Orm.GetRepository(); + + this.Repository.SaveMany(this as TEntity, navigatePropertyName); + } } } diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index cec6c1b2..1dfb5296 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -174,10 +174,15 @@ namespace FreeSql else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); } var propValEach = GetItemValue(item, prop) as IEnumerable; - await _db.Orm.Delete().AsType(tref.RefEntityType) + var subDelete = _db.Orm.Delete().AsType(tref.RefEntityType) .WithTransaction(_uow?.GetOrBeginTransaction()) - .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)) - .WhereDynamic(propValEach, true).ExecuteAffrowsAsync(); + .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)); + foreach (var propValItem in propValEach) + { + subDelete.WhereDynamic(propValEach, true); + break; + } + await subDelete.ExecuteAffrowsAsync(); } } finally diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 10a10f57..7ffb4adc 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -186,10 +186,15 @@ namespace FreeSql else whereParentExp = Expression.AndAlso(whereParentExp, whereExp); } var propValEach = GetItemValue(item, prop) as IEnumerable; - _db.Orm.Delete().AsType(tref.RefEntityType) + var subDelete = _db.Orm.Delete().AsType(tref.RefEntityType) .WithTransaction(_uow?.GetOrBeginTransaction()) - .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)) - .WhereDynamic(propValEach, true).ExecuteAffrows(); + .Where(Expression.Lambda>(whereParentExp, deleteWhereParentParam)); + foreach (var propValItem in propValEach) + { + subDelete.WhereDynamic(propValEach, true); + break; + } + subDelete.ExecuteAffrows(); } } finally diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 2735cefb..ca7c357b 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -110,6 +110,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index 3097044b..7d0a479e 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -335,6 +335,57 @@ namespace FreeSql.Tests public Guid CagetoryId { get; set; } public string Name { get; set; } } + [Fact] + public void SaveMany_OneToMany() + { + var repo = g.sqlite.GetRepository(); + repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //رռ湦 + var cts = new[] { + new Cagetory + { + Name = "1", + Goodss = new List(new[] + { + new Goods { Name = "Ʒ1" }, + new Goods { Name = "Ʒ2" }, + new Goods { Name = "Ʒ3" } + }) + }, + new Cagetory + { + Name = "2", + Goodss = new List(new[] + { + new Goods { Name = "Ʒ4" }, + new Goods { Name = "Ʒ5" } + }) + } + }; + repo.Insert(cts); + repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + cts[0].Goodss.RemoveAt(1); + cts[1].Goodss.RemoveAt(1); + repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + + cts[0].Name = "11"; + cts[0].Goodss.Clear(); + cts[1].Name = "22"; + cts[1].Goodss.Clear(); + repo.Update(cts); + repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + cts[0].Name = "111"; + cts[0].Goodss.Clear(); + cts[0].Goodss.Add(new Goods { Name = "Ʒ33" }); + cts[1].Name = "222"; + cts[1].Goodss.Clear(); + cts[1].Goodss.Add(new Goods { Name = "Ʒ55" }); + repo.Update(cts); + repo.SaveMany(cts[0], "Goodss"); //ָ Goodss һԶ + repo.SaveMany(cts[1], "Goodss"); //ָ Goodss һԶ + } [Fact] public void EnableAddOrUpdateNavigateList_OneToMany_Parent() @@ -417,7 +468,7 @@ namespace FreeSql.Tests } }; var repo = g.sqlite.GetRepository(); - //repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //رռ湦 + repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //򿪼湦 repo.Insert(ss); //repo.SaveMany(ss[0], "Tags"); //ָ Tags Զ