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; } 不变,不影响业务场景。
相关推荐
结网的兔子3 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
2501_915909064 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
AI多Agent协作实战派6 小时前
AI多Agent协作系统实战(二十八):顶栏统一战争——从1个页面异常到31个页面全量对齐
数据库·人工智能·uni-app
00后程序员张7 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
2501_916008891 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
name好难取诶1 天前
通过对云基座和离线基座的对比,帮助开发者理解如何在不同场景下选择合适的打包方案。 什么是“基座” 在 UniApp 中,基座(也称“ ...
开发语言·uni-app·php
2501_915921431 天前
iOS手游安全反外挂解决方案:基于Xcode的加固混淆特色详解
android·安全·ios·小程序·uni-app·iphone·xcode
2501_916007471 天前
iOS App分发教程 App Store、TestFlight 与 Ad Hoc 的配置与上传方法
android·ios·小程序·https·uni-app·iphone·webview
qq_316837751 天前
uniapp 打包APP 使用 Galacean Effects 的特效
uni-app
古韵2 天前
你的 uni-app 分页,一个 hook 搞定竞态和加载
javascript·vue.js·uni-app