You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:58:14