mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 12:03:21 +08:00
- 增加 BaseEntity SaveMany 方法;
This commit is contained in:
parent
b71e7c1b23
commit
ab52728f7f
@ -143,6 +143,19 @@ namespace FreeSql
|
|||||||
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
||||||
return this.Repository.InsertOrUpdate(this as TEntity);
|
return this.Repository.InsertOrUpdate(this as TEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 【完整】保存导航属性,子表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="navigatePropertyName">导航属性名</param>
|
||||||
|
public virtual void SaveMany(string navigatePropertyName)
|
||||||
|
{
|
||||||
|
if (this.Repository == null)
|
||||||
|
this.Repository = Orm.GetRepository<TEntity>();
|
||||||
|
|
||||||
|
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
||||||
|
this.Repository.SaveMany(this as TEntity, navigatePropertyName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +125,19 @@ namespace FreeSql
|
|||||||
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
||||||
return this.Repository.InsertOrUpdateAsync(this as TEntity);
|
return this.Repository.InsertOrUpdateAsync(this as TEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 【完整】保存导航属性,子表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="navigatePropertyName">导航属性名</param>
|
||||||
|
public virtual Task SaveManyAsync(string navigatePropertyName)
|
||||||
|
{
|
||||||
|
if (this.Repository == null)
|
||||||
|
this.Repository = Orm.GetRepository<TEntity>();
|
||||||
|
|
||||||
|
this.Repository.UnitOfWork = UnitOfWork.Current.Value;
|
||||||
|
return this.Repository.SaveManyAsync(this as TEntity, navigatePropertyName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,6 +104,18 @@ namespace FreeSql
|
|||||||
|
|
||||||
return this.Repository.InsertOrUpdate(this as TEntity);
|
return this.Repository.InsertOrUpdate(this as TEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 【完整】保存导航属性,子表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="navigatePropertyName">导航属性名</param>
|
||||||
|
public virtual void SaveMany(string navigatePropertyName)
|
||||||
|
{
|
||||||
|
if (this.Repository == null)
|
||||||
|
this.Repository = Orm.GetRepository<TEntity>();
|
||||||
|
|
||||||
|
this.Repository.SaveMany(this as TEntity, navigatePropertyName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,10 +174,15 @@ namespace FreeSql
|
|||||||
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
|
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
|
||||||
}
|
}
|
||||||
var propValEach = GetItemValue(item, prop) as IEnumerable;
|
var propValEach = GetItemValue(item, prop) as IEnumerable;
|
||||||
await _db.Orm.Delete<object>().AsType(tref.RefEntityType)
|
var subDelete = _db.Orm.Delete<object>().AsType(tref.RefEntityType)
|
||||||
.WithTransaction(_uow?.GetOrBeginTransaction())
|
.WithTransaction(_uow?.GetOrBeginTransaction())
|
||||||
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
|
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam));
|
||||||
.WhereDynamic(propValEach, true).ExecuteAffrowsAsync();
|
foreach (var propValItem in propValEach)
|
||||||
|
{
|
||||||
|
subDelete.WhereDynamic(propValEach, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
await subDelete.ExecuteAffrowsAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
@ -186,10 +186,15 @@ namespace FreeSql
|
|||||||
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
|
else whereParentExp = Expression.AndAlso(whereParentExp, whereExp);
|
||||||
}
|
}
|
||||||
var propValEach = GetItemValue(item, prop) as IEnumerable;
|
var propValEach = GetItemValue(item, prop) as IEnumerable;
|
||||||
_db.Orm.Delete<object>().AsType(tref.RefEntityType)
|
var subDelete = _db.Orm.Delete<object>().AsType(tref.RefEntityType)
|
||||||
.WithTransaction(_uow?.GetOrBeginTransaction())
|
.WithTransaction(_uow?.GetOrBeginTransaction())
|
||||||
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam))
|
.Where(Expression.Lambda<Func<object, bool>>(whereParentExp, deleteWhereParentParam));
|
||||||
.WhereDynamic(propValEach, true).ExecuteAffrows();
|
foreach (var propValItem in propValEach)
|
||||||
|
{
|
||||||
|
subDelete.WhereDynamic(propValEach, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
subDelete.ExecuteAffrows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
@ -110,6 +110,13 @@
|
|||||||
清空状态数据
|
清空状态数据
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
根据 lambda 条件删除数据
|
||||||
|
</summary>
|
||||||
|
<param name="predicate"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
||||||
<summary>
|
<summary>
|
||||||
添加
|
添加
|
||||||
|
@ -335,6 +335,57 @@ namespace FreeSql.Tests
|
|||||||
public Guid CagetoryId { get; set; }
|
public Guid CagetoryId { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
}
|
}
|
||||||
|
[Fact]
|
||||||
|
public void SaveMany_OneToMany()
|
||||||
|
{
|
||||||
|
var repo = g.sqlite.GetRepository<Cagetory>();
|
||||||
|
repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //关闭级联保存功能
|
||||||
|
var cts = new[] {
|
||||||
|
new Cagetory
|
||||||
|
{
|
||||||
|
Name = "分类1",
|
||||||
|
Goodss = new List<Goods>(new[]
|
||||||
|
{
|
||||||
|
new Goods { Name = "商品1" },
|
||||||
|
new Goods { Name = "商品2" },
|
||||||
|
new Goods { Name = "商品3" }
|
||||||
|
})
|
||||||
|
},
|
||||||
|
new Cagetory
|
||||||
|
{
|
||||||
|
Name = "分类2",
|
||||||
|
Goodss = new List<Goods>(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]
|
[Fact]
|
||||||
public void EnableAddOrUpdateNavigateList_OneToMany_Parent()
|
public void EnableAddOrUpdateNavigateList_OneToMany_Parent()
|
||||||
@ -417,7 +468,7 @@ namespace FreeSql.Tests
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
var repo = g.sqlite.GetRepository<Song>();
|
var repo = g.sqlite.GetRepository<Song>();
|
||||||
//repo.DbContextOptions.EnableAddOrUpdateNavigateList = false; //关闭级联保存功能
|
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //打开级联保存功能
|
||||||
repo.Insert(ss);
|
repo.Insert(ss);
|
||||||
//repo.SaveMany(ss[0], "Tags"); //指定保存 Tags 多对多属性
|
//repo.SaveMany(ss[0], "Tags"); //指定保存 Tags 多对多属性
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user