mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-04 23:40:53 +08:00
update
@@ -25,6 +25,7 @@
|
|||||||
* [仓储层](Repository) [Repository Layer](Repository-Layer)
|
* [仓储层](Repository) [Repository Layer](Repository-Layer)
|
||||||
* [工作单元](%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83) [Unit of Work](Unit-of-Work)
|
* [工作单元](%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83) [Unit of Work](Unit-of-Work)
|
||||||
* [联级保存](%e8%81%94%e7%ba%a7%e4%bf%9d%e5%ad%98) [Cascade Saving](Cascade-Saving)
|
* [联级保存](%e8%81%94%e7%ba%a7%e4%bf%9d%e5%ad%98) [Cascade Saving](Cascade-Saving)
|
||||||
|
* [联级删除](%E8%81%94%E7%BA%A7%E5%88%A0%E9%99%A4)
|
||||||
* [工作单元管理器](DI-UnitOfWorkManager事务) [UoW Manager](Unit-of-Work-Manager)
|
* [工作单元管理器](DI-UnitOfWorkManager事务) [UoW Manager](Unit-of-Work-Manager)
|
||||||
* [DbContext](DbContext)
|
* [DbContext](DbContext)
|
||||||
* [CodeFirst](CodeFirst)
|
* [CodeFirst](CodeFirst)
|
||||||
|
|||||||
83
联级删除.md
Normal file
83
联级删除.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
## 基于【对象】级联删除
|
||||||
|
|
||||||
|
> 比如 Include/IncludeMany 查询的对象,可以使用此方法级联删除它们。
|
||||||
|
|
||||||
|
```c#
|
||||||
|
var repo = fsql.GetRepository<Group>();
|
||||||
|
repo.DbContextOptions.EnableCascadeSave = true; //关键设置
|
||||||
|
repo.Insert(new UserGroup
|
||||||
|
{
|
||||||
|
GroupName = "group01",
|
||||||
|
Users = new List<User>
|
||||||
|
{
|
||||||
|
new User { Username = "admin01", Password = "pwd01", UserExt = new UserExt { Remark = "用户备注01" } },
|
||||||
|
new User { Username = "admin02", Password = "pwd02", UserExt = new UserExt { Remark = "用户备注02" } },
|
||||||
|
new User { Username = "admin03", Password = "pwd03", UserExt = new UserExt { Remark = "用户备注03" } },
|
||||||
|
}
|
||||||
|
}); //级联添加测试数据
|
||||||
|
//INSERT INTO "usergroup"("groupname") VALUES('group01') RETURNING "id"
|
||||||
|
//INSERT INTO "user"("username", "password", "groupid") VALUES('admin01', 'pwd01', 1), ('admin02', 'pwd02', 1), ('admin03', 'pwd03', 1) RETURNING "id" as "Id", "username" as "Username", "password" as "Password", "groupid" as "GroupId"
|
||||||
|
//INSERT INTO "userext"("userid", "remark") VALUES(3, '用户备注01'), (4, '用户备注02'), (5, '用户备注03')
|
||||||
|
|
||||||
|
var groups = repo.Select
|
||||||
|
.IncludeMany(a => a.Users,
|
||||||
|
then => then.Include(b => b.UserExt))
|
||||||
|
.ToList();
|
||||||
|
repo.Delete(groups); //级联删除,递归向下遍历 group OneToOne/OneToMany/ManyToMany 导航属性
|
||||||
|
//DELETE FROM "userext" WHERE ("userid" IN (3,4,5))
|
||||||
|
//DELETE FROM "user" WHERE ("id" IN (3,4,5))
|
||||||
|
//DELETE FROM "usergroup" WHERE ("id" = 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 基于【数据库】级联删除
|
||||||
|
|
||||||
|
> 根据设置的导航属性,递归删除 OneToOne/OneToMany/ManyToMany 对应数据,并返回已删除的数据。此功能不依赖数据库外键
|
||||||
|
|
||||||
|
```c#
|
||||||
|
var repo = fsql.GetRepository<Group>();
|
||||||
|
var ret = repo.DeleteCascadeByDatabase(a => a.Id == 1);
|
||||||
|
//SELECT a."id", a."username", a."password", a."groupid" FROM "user" a WHERE (a."groupid" = 1)
|
||||||
|
//SELECT a."userid", a."remark" FROM "userext" a WHERE (a."userid" IN (3,4,5))
|
||||||
|
//DELETE FROM "userext" WHERE ("userid" IN (3,4,5))
|
||||||
|
//DELETE FROM "user" WHERE ("id" IN (3,4,5))
|
||||||
|
//DELETE FROM "usergroup" WHERE ("id" = 1)
|
||||||
|
|
||||||
|
//ret Count = 7 System.Collections.Generic.List<object>
|
||||||
|
// [0] {UserExt} object {UserExt}
|
||||||
|
// [1] {UserExt} object {UserExt}
|
||||||
|
// [2] {UserExt} object {UserExt}
|
||||||
|
// [3] {User} object {User}
|
||||||
|
// [4] {User} object {User}
|
||||||
|
// [5] {User} object {User}
|
||||||
|
// [6] {UserGroup} object {UserGroup}
|
||||||
|
|
||||||
|
public class Group
|
||||||
|
{
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string GroupName { get; set; }
|
||||||
|
|
||||||
|
[Navigate(nameof(User.GroupId))]
|
||||||
|
public List<User> Users { get; set; }
|
||||||
|
}
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Username { get; set; }
|
||||||
|
public string Password { get; set; }
|
||||||
|
public int GroupId { get; set; }
|
||||||
|
|
||||||
|
[Navigate(nameof(Id))]
|
||||||
|
public UserExt UserExt { get; set; }
|
||||||
|
}
|
||||||
|
public class UserExt
|
||||||
|
{
|
||||||
|
[Column(IsPrimary = true)]
|
||||||
|
public int UserId { get; set; }
|
||||||
|
public string Remark { get; set; }
|
||||||
|
|
||||||
|
[Navigate(nameof(UserId))]
|
||||||
|
public User User { get; set; }
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user