如何删除Maui应用中关联Groups表的Sites及Groups记录?
MAUI SQLite 关联删除选中Groups及对应Sites的解决方案
由于SQLite-net(你使用的SQLiteAsyncConnection所属库)的LINQ查询不支持直接的JOIN式关联删除,你可以通过以下两种方案实现需求:
方案一:分步删除(无需修改数据库结构)
先删除关联的Sites记录,再删除选中的Groups记录,逻辑简单直接,适配现有数据库结构:
实现代码
假设你从DataGrid中获取了选中的Groups集合selectedGroups:
public async Task DeleteSelectedGroups(List<Groups> selectedGroups) { if (selectedGroups == null || !selectedGroups.Any()) return; // 提取选中Groups的ID列表 var selectedGroupIds = selectedGroups.Select(g => g.Id).ToList(); // 第一步:删除所有关联的Sites记录 await Conn.Table<Sites>() .Where(site => selectedGroupIds.Contains(site.GrpId)) .DeleteAsync(); // 第二步:删除选中的Groups记录 await Conn.Table<Groups>() .Where(group => selectedGroupIds.Contains(group.Id)) .DeleteAsync(); }
方案二:启用外键级联删除(一劳永逸)
通过开启SQLite外键约束并设置级联删除规则,后续删除Groups时会自动删除关联的Sites,无需手动处理子表:
步骤1:修改数据库初始化代码,开启外键约束
var dbname = GenDbName(); var dbpath = Path.Combine(dbLoc, dbname); // 开启外键约束 var options = new SQLiteConnectionString(dbpath, true, foreignKeysEnabled: true); Conn = new SQLiteAsyncConnection(options); await Conn.CreateTablesAsync<Groups, Sites>(CreateFlags.AutoIncPK); // 为Sites表添加外键级联删除约束(仅首次初始化时执行,避免重复报错) try { await Conn.ExecuteAsync(@" ALTER TABLE Sites ADD CONSTRAINT FK_Sites_Groups FOREIGN KEY (GrpId) REFERENCES Groups(Id) ON DELETE CASCADE"); } catch (SQLiteException ex) { // 忽略"约束已存在"的错误 if (!ex.Message.Contains("already exists")) throw; }
步骤2:简化删除代码
之后删除选中Groups时,只需执行Groups的删除操作,关联的Sites会被自动删除:
public async Task DeleteSelectedGroups(List<Groups> selectedGroups) { if (selectedGroups == null || !selectedGroups.Any()) return; var selectedGroupIds = selectedGroups.Select(g => g.Id).ToList(); await Conn.Table<Groups>() .Where(group => selectedGroupIds.Contains(group.Id)) .DeleteAsync(); }
注意事项
- 若数据库已有数据,添加外键约束前需确保所有
Sites的GrpId都对应存在的Groups.Id,否则会触发约束错误。 - 外键约束仅在开启
foreignKeysEnabled: true后生效,SQLite默认支持该特性。
内容的提问来源于stack exchange,提问作者Bob Gatto
相关产品推荐
相关产品推荐

