Skip to content
FreeSql 官方文档FreeSql 官方文档
指南
扩展
服务支持
github icon
  • 指南

      • 仓储
        • UnitOfWork
          • 级联保存
            • 级联删除
              • 基于【对象】级联删除
                • 基于【数据库】级联删除
                • UnitOfWorkManager 事务
                • DB First
                  • 表达式函数
                    • 事务
                      • 过滤器
                        • ADO
                          • AOP✨
                            • 读写分离
                              • 分表分库
                                • 多租户
                                  • 性能
                                    • 动态操作
                                      • 你不知道的功能 ✨

                                      级联删除

                                      author iconnicyecalendar icon2022年7月30日timer icon大约 2 分钟word icon约 474 字

                                      此页内容
                                      • 基于【对象】级联删除
                                      • 基于【数据库】级联删除

                                      # 级联删除

                                      # 基于【对象】级联删除

                                      比如 Include/IncludeMany 查询的对象,可以使用此方法级联删除它们。

                                      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)
                                      
                                      1
                                      2
                                      3
                                      4
                                      5
                                      6
                                      7
                                      8
                                      9
                                      10
                                      11
                                      12
                                      13
                                      14
                                      15
                                      16
                                      17
                                      18
                                      19
                                      20
                                      21
                                      22
                                      23
                                      24

                                      # 基于【数据库】级联删除

                                      根据设置的导航属性,递归删除 OneToOne/OneToMany/ManyToMany 对应数据,并返回已删除的数据。此功能不依赖数据库外键

                                      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; }
                                      }
                                      
                                      1
                                      2
                                      3
                                      4
                                      5
                                      6
                                      7
                                      8
                                      9
                                      10
                                      11
                                      12
                                      13
                                      14
                                      15
                                      16
                                      17
                                      18
                                      19
                                      20
                                      21
                                      22
                                      23
                                      24
                                      25
                                      26
                                      27
                                      28
                                      29
                                      30
                                      31
                                      32
                                      33
                                      34
                                      35
                                      36
                                      37
                                      38
                                      39
                                      40
                                      41
                                      42
                                      43
                                      44
                                      45
                                      46
                                      edit icon在 GitHub 上编辑此页open in new window
                                      上次编辑于: 2022/7/30 09:07:52
                                      贡献者: igeekfan
                                      上一页
                                      级联保存
                                      下一页
                                      UnitOfWorkManager 事务
                                      Copyright © 2018-present nicye
                                      Copyright © 2022 nicye

                                      该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                                      详情