diff --git a/_Sidebar.md b/_Sidebar.md index 91b1e83..3c262f1 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -25,6 +25,7 @@ * [仓储层](Repository) [Repository Layer](Repository-Layer) * [工作单元](%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%E5%88%A0%E9%99%A4) * [工作单元管理器](DI-UnitOfWorkManager事务) [UoW Manager](Unit-of-Work-Manager) * [DbContext](DbContext) * [CodeFirst](CodeFirst) diff --git a/联级删除.md b/联级删除.md new file mode 100644 index 0000000..447d128 --- /dev/null +++ b/联级删除.md @@ -0,0 +1,83 @@ +## 基于【对象】级联删除 + +> 比如 Include/IncludeMany 查询的对象,可以使用此方法级联删除它们。 + +```c# +var repo = fsql.GetRepository(); +repo.DbContextOptions.EnableCascadeSave = true; //关键设置 +repo.Insert(new UserGroup +{ + GroupName = "group01", + Users = new List + { + 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(); +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 +// [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 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; } +} +``` \ No newline at end of file