当前位置: 首页 > news >正文

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

简介

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

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

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

需求

我有多个表
Greenhouse、Device、User
在操作这些表的时候,会创建一些日志。
我将这些日志统一存储到一个IotLog表中。

IotLog 表结构


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为例,


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 修改

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; } 不变,不影响业务场景。
http://www.dtcms.com/a/494863.html

相关文章:

  • Java从入门到精通 - 集合框架(二)
  • 3proxy保姆级教程:WIN连接远端HTTPS代理
  • 大厂AI各走“开源”路
  • 室内装修效果图网站有哪些百度网盟推广是什么
  • grootN1 grootN1.5 gr00t安装方法以及使用(学习)
  • Typora(跨平台MarkDown编辑器) v1.12.2 中文绿色版
  • Unity开发抖音小游戏的震动
  • 团队作业——概要设计和数据库设计
  • 在Spring Boot开发中,HEAD、OPTIONS和 TRACE这些HTTP方法各有其特定的应用场景和实现方式
  • Flink DataStream「全分区窗口处理」mapPartition / sortPartition / aggregate / reduce
  • 网站备案号码查询大连网页设计哪家好
  • Next.js 入门指南
  • arcgis api for javascript 修改地图图层要素默认的高亮效果
  • 【论文速递】2025年第28周(Jul-06-12)(Robotics/Embodied AI/LLM)
  • 宁波市鄞州区建设局网站怎么做网站静态布局
  • 一文掌握 CodeX CLI 安装以及使用!
  • Android实战进阶 - 用户闲置超时自动退出登录功能详解
  • 2二、u-boot移植
  • 淄博网站建设哪家好常德网站建设技术
  • Java Spring日志
  • OpenAI Agent Kit 全网首发深度解读与上手指南
  • 网络:2.Socket编程UDP
  • Linux服务器编程实践45-UDP数据读写:recvfrom与sendto函数的使用实例
  • 基于SpringBoot+Vue的数码交流管理系统(AI问答、协同过滤算法、websocket实时聊天、Echarts图形化分析)
  • 设计模式篇之 状态模式 State
  • linux系统编程(十)RK3568 socket之 UDP的实现
  • MySQL事务隔离
  • 甜点的网站建设规划书长春市城乡建设局网站
  • C++ 多线程实战 11|如何系统性避免死锁
  • WAPR断网攻击天阶大法根基法之wifi爆破