Uniapp微信小程序开发:EF Core 中级联删除

简介

本文介绍了如何在EF Core中配置级联删除,以解决删除Greenhouse时自动删除相关IotLog的需求。

通过在DbContext的OnModelCreating方法中配置实体关系,使用HasMany/WithOne定义一对多关系,并设置OnDelete(DeleteBehavior.Cascade)启用级联删除。

这样当删除温室时,所有关联该温室的日志会被自动删除,而GreenHouseId为NULL的日志不受影响,既满足了业务需求,又保持了数据完整性。

需求

我有多个表

Greenhouse、Device、User

在操作这些表的时候,会创建一些日志。

我将这些日志统一存储到一个IotLog表中。

IotLog 表结构

csharp 复制代码
public class IotLog
{
    [Key]
    [StringLength(36)]
    public string IotLogId { get; set; } = Guid.NewGuid().ToString();
    [StringLength(36)]
    public string? DeviceId { get; set; }
    [StringLength(36)]
    public string? UserId { get; set; }
    [StringLength(36)]
    public string? GreenHouseId { get; set; }

    //中间省略
    
    [JsonIgnore]
    public virtual Greenhouse? Greenhouse { get; set; } = null!;
}

目标,删除Greenhouse、Device、User时,需要删除对应的日志。这就涉及到级联删除了。

以Greenhouse为例,

csharp 复制代码
public class Greenhouse
{
    [Key]
    [StringLength(36)]
    public string GreenhouseId { get; set; } = Guid.NewGuid().ToString();
//中间省略
    [JsonIgnore]
    public virtual ICollection<IotLog> IotLogs { get; set; } = new List<IotLog>();
}

目前在属性上,添加特性,已经无法做到了。因此,需要在 DbContext中进行更多配置

DbContext 修改

csharp 复制代码
public class MySQLContext : DbContext
{
    // 其他 DbSet 定义...
    public DbSet<Greenhouse> Greenhouses { get; set; }
    public DbSet<IotLog> IotLogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置 Greenhouse 与 IotLog 的一对多关系,并启用级联删除
        modelBuilder.Entity<Greenhouse>()
            .HasMany(g => g.IotLogs)  // 一个温室关联多个日志
            .WithOne(l => l.Greenhouse)  // 一个日志关联一个温室
            .HasForeignKey(l => l.GreenHouseId)  // 外键字段
            .OnDelete(DeleteBehavior.Cascade);  // 关键:级联删除规则

        // 其他实体配置...
    }
}

说明

OnDelete(DeleteBehavior.Cascade) 会强制数据库生成 ON DELETE CASCADE 外键约束,无论 GreenHouseId 是否可空。当删除温室时:

  • 所有 GreenHouseId 等于该温室 ID 的日志会被自动删除;
  • GreenHouseId 为 NULL 的日志不受影响(符合业务需求)。
  • 保持 IotLog 中 public string? GreenHouseId { get; set; } 不变,不影响业务场景。
相关推荐
MY_TEUCK1 天前
【AI 应用】前端接口联调工程化:把 Swagger 接入沉淀成可复用 Skill
前端·人工智能·uni-app·状态模式
上架ipa1 天前
uniapp打包ios配置、申请证书、测试和上架综合教程
uni-app
00后程序员张1 天前
完整指南 iOS App上架到App Store的步骤详解
macos·ios·小程序·uni-app·objective-c·cocoa·iphone
hhzz1 天前
记录微信小程序tabbar不显示问题:uni-app Vue 3 自定义 tabBar 不渲染
vue.js·微信小程序·uni-app
存在的五月雨1 天前
uniapp 一些组件的使用
java·前端·uni-app
久爱@勿忘1 天前
uniappH5跳转小程序
前端·小程序·uni-app
郑州光合科技余经理2 天前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
启山智软2 天前
前沿主流技术栈商城系统(Java JDK21 + Vue3 + Uniapp)
java·开发语言·uni-app
WeirdOwl2 天前
uniapp 嵌入外部h5 报错/收不到消息
uni-app
敲代码的鱼哇4 天前
发送短信/拨打电话/获取联系人能力 UTS 插件(cz-sms)
android·前端·ios·uni-app·安卓·harmonyos·鸿蒙