diff --git a/Repository.md b/Repository.md index f703afd..6566417 100644 --- a/Repository.md +++ b/Repository.md @@ -170,6 +170,7 @@ SqlServer 提供的 output inserted 特性,在表使用了自增或数据库 | Delete | int | Lambda | 根据 lambda 条件删除数据 | | Delete | int | TEntity | 删除数据 | | Delete | int | IEnumerable\ | 批量删除数据 | +| DeleteCascade | List\ | TEntity \| IEnumerable\ \| Lambda | 根据导航属性递归删除数据 | | Insert | - | TEntity | 插入数据,若实体有自增列,插入后的自增值会填充到实体中 | | Insert | - | IEnumerable\ | 批量插入数据 | | Update | - | TEntity | 更新数据 | diff --git a/删除.md b/删除.md index 707a652..426f7f2 100644 --- a/删除.md +++ b/删除.md @@ -95,6 +95,75 @@ DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1i - 删除前可预览测试数据,防止错误删除操作; - 支持复杂的删除操作,例如:`ISelect` 上使用 `Limit(10)` 删除附合条件的前 10 条记录; +## IBaseRepository.DeleteCascade 级联删除 + +根据设置的导航属性,递归查询删除 OneToOne/OneToMany/ManyToMany 数据,并返回已删除的数据。 + +```c# +var repo = fsql.GetRepository(); +repo.DbContextOptions.EnableAddOrUpdateNavigate = true; +var group = 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" } }, + } +}; +repo.Insert(group); +//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 ret = repo.DeleteCascade(group); +//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; } +} +``` + ## 参考资料 - [《数据库事务》](%e4%ba%8b%e5%8a%a1)