EF Core中ExecuteDelete的隐藏陷阱:你必须知道的3个使用注意事项

第一章:ExecuteDelete的引入背景与核心价值

在现代数据驱动的应用架构中,数据删除操作不仅是基础功能,更是保障系统合规性与资源效率的关键环节。传统的删除方式往往依赖手动编写SQL语句或通过ORM框架进行封装,存在安全隐患、维护成本高以及难以统一审计等问题。为应对这些挑战,ExecuteDelete 被设计为一种标准化、可复用且安全的数据删除执行机制,广泛应用于微服务与分布式系统中。

解决传统删除模式的痛点

  • 避免直接暴露原始SQL,降低SQL注入风险
  • 统一删除逻辑入口,便于权限控制与日志追踪
  • 支持软删除与硬删除策略的灵活切换

核心优势一览

特性说明
声明式调用通过接口定义而非具体实现调用删除操作
事务一致性自动纳入当前事务上下文,确保数据一致性
扩展性强支持插件化审计、回调钩子等扩展能力

典型使用场景示例

// 定义删除请求
type DeleteRequest struct {
    ID string `json:"id"`
}

// 执行安全删除操作
func HandleDelete(req DeleteRequest) error {
    // 封装删除指令,由ExecuteDelete统一处理
    return ExecuteDelete(&DeleteParams{
        Entity:   "User",
        Filter:   map[string]interface{}{"id": req.ID},
        SoftDelete: true, // 启用软删除
    })
}
上述代码展示了如何通过 ExecuteDelete 安全地执行一次用户记录删除,其内部自动处理字段校验、权限检查与数据库交互,开发者无需关注底层细节。
graph TD A[客户端发起删除请求] --> B{ExecuteDelete拦截} B --> C[执行权限验证] C --> D[判断软/硬删除策略] D --> E[写入审计日志] E --> F[提交数据库事务]

第二章:ExecuteDelete的基本原理与使用场景

2.1 理解ExecuteDelete的设计动机与性能优势

在现代数据访问框架中,ExecuteDelete 方法的引入旨在解决传统删除操作中资源消耗高、执行效率低的问题。通过绕过实体加载过程,直接生成并执行 SQL DELETE 语句,显著减少了数据库往返开销。
设计动机
传统删除需先查询实体再删除,涉及多次 I/O 操作。而 ExecuteDelete 允许在不加载实体的情况下批量删除,适用于清理过期日志等场景。
性能优势示例
context.Users
    .Where(u => u.LastLogin < DateTime.Now.AddMonths(-6))
    .ExecuteDelete();
上述代码直接翻译为单条 SQL 删除语句,避免了对象实例化开销。参数说明:查询条件在表达式树中解析,由 EF Core 7+ 编译为高效 DELETE 命令。
  • 减少内存占用:无需构建实体实例
  • 提升吞吐量:单次数据库调用完成批量删除
  • 降低锁争用:操作原子性增强,事务持有时间更短

2.2 ExecuteDelete与传统查询删除模式的对比分析

在数据操作中,ExecuteDelete 提供了直接删除机制,避免了传统“先查询后删除”模式带来的额外开销。
执行效率对比
传统模式需发起两次数据库交互:一次查询判断是否存在,一次执行删除。而 ExecuteDelete 通过原子性操作直接删除符合条件的数据。
-- 传统模式
SELECT id FROM users WHERE status = 'inactive';
DELETE FROM users WHERE status = 'inactive';

-- 使用 ExecuteDelete
EXECUTE DELETE FROM users WHERE status = 'inactive';
上述代码显示,ExecuteDelete 合并操作流程,减少网络往返和锁持有时间。
性能与资源消耗对比
模式查询次数事务占用时间并发冲突概率
传统模式2次较长高
ExecuteDelete1次短低

2.3 在不同数据库上的兼容性与执行差异

在跨数据库环境中,SQL语法和函数支持存在显著差异,影响查询的可移植性。例如,分页查询在MySQL中使用LIMIT,而Oracle则依赖ROWNUM。
常见数据库分页语法对比
数据库分页语法
MySQLLIMIT offset, size
PostgreSQLOFFSET offset LIMIT size
OracleWHERE ROWNUM <= N
SQL ServerOFFSET offset ROWS FETCH NEXT size ROWS ONLY
代码示例:统一分页逻辑封装
-- 动态生成分页语句(以 PostgreSQL 为例)
SELECT * FROM users 
ORDER BY id 
OFFSET 10 LIMIT 20;
该语句跳过前10条记录,返回接下来的20条。OFFSET从0开始计数,LIMIT控制返回行数,适用于实现分页接口。

2.4 如何正确构建可执行删除的查询条件

在设计可执行删除操作的查询条件时,首要原则是确保条件精确且具备唯一性,避免误删数据。使用主键或唯一索引字段作为删除条件是最安全的做法。
推荐的查询结构
DELETE FROM users 
WHERE id = 123 
  AND status = 'inactive';
该语句通过主键 id 定位记录,同时增加 status 状态校验,防止误删活跃用户。这种双重条件机制提升了操作安全性。
常见错误与规避策略
  • 避免无 WHERE 条件的全表删除
  • 禁止使用模糊匹配如 LIKE '%abc%' 作为删除依据
  • 批量删除前应先执行 SELECT 验证条件范围
对于复杂业务场景,建议结合事务控制与日志审计,确保删除可追溯、可回滚。

2.5 执行上下文生命周期中的调用时机控制

在执行上下文的生命周期中,调用时机的精确控制对系统行为的一致性至关重要。通过钩子函数和状态监听机制,可以在上下文创建、激活与销毁阶段插入自定义逻辑。
生命周期关键节点
  • 初始化阶段:分配资源并设置初始状态
  • 激活阶段:上下文被调度器选中执行
  • 挂起阶段:响应中断或等待事件时保存现场
  • 销毁阶段:释放资源并通知依赖方
代码示例:Go 中的上下文控制
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // 确保在函数退出时触发取消信号

select {
case result := <-doWork(ctx):
    fmt.Println("完成:", result)
case <-ctx.Done():
    fmt.Println("超时或被取消:", ctx.Err())
}
该代码通过 context.WithTimeout 设置执行时限,cancel() 显式释放资源。在 select 中监听上下文完成信号,实现对调用时机的精细控制。

第三章:常见误用及其引发的问题

3.1 忽视变更追踪导致的业务逻辑断裂

在分布式系统中,若未对数据变更进行有效追踪,极易引发业务状态不一致。例如,订单支付成功后未记录状态变更事件,导致发货服务无法感知更新。
变更事件缺失的典型场景
  • 数据库直接更新,未发布领域事件
  • 消息队列发送失败且无重试机制
  • 微服务间依赖轮询而非事件驱动
基于事件溯源的修复方案
type OrderEvent struct {
    OrderID   string
    EventType string // "Paid", "Shipped"
    Timestamp time.Time
}

// 发布支付完成事件
event := OrderEvent{
    OrderID:   "O123",
    EventType: "Paid",
    Timestamp: time.Now(),
}
eventBus.Publish(&event)
上述代码通过显式发布Paid事件,确保下游服务可订阅并触发后续流程,避免逻辑链断裂。事件结构包含关键标识与时间戳,为追踪与回放提供基础。

3.2 绕过领域事件带来的副作用分析

在领域驱动设计中,领域事件用于解耦业务逻辑,但不当使用可能导致数据不一致或重复处理等副作用。绕过事件机制直写数据库或跳过事件发布,会破坏事件溯源的完整性。
常见绕行场景
  • 性能优化时跳过事件发布
  • 迁移旧系统数据绕过事件重建
  • 测试环境中手动修改状态
代码示例:错误的绕行方式

func (s *OrderService) CancelOrderDirectly(orderID string) {
    // 错误:直接更新状态,未发布 OrderCancelledEvent
    s.repo.UpdateStatus(orderID, "CANCELLED")
    // 缺失:s.eventBus.Publish(&OrderCancelledEvent{OrderID: orderID})
}
上述代码跳过了事件发布,导致下游系统(如库存、通知)无法感知订单取消,引发数据不一致。
影响对比表
行为一致性可追溯性
正常发布事件高完整
绕过事件直写低断裂

3.3 并发环境下数据一致性风险剖析

在高并发系统中,多个线程或进程同时访问共享资源时,极易引发数据不一致问题。典型场景包括竞态条件、脏读和更新丢失。
竞态条件示例
// 模拟并发自增操作
func increment(counter *int32, wg *sync.WaitGroup) {
    defer wg.Done()
    time.Sleep(time.Millisecond)
    current := atomic.LoadInt32(counter)
    atomic.StoreInt32(counter, current+1) // 非原子操作将导致结果错误
}
上述代码若未使用atomic包,多个goroutine读取相同旧值后叠加,最终结果将小于预期。
常见一致性问题分类
  • 脏读:事务读取了未提交的中间状态;
  • 不可重复读:同一事务内多次读取结果不一致;
  • 幻读:因其他事务插入新数据导致查询结果集变化。
隔离级别对比
隔离级别脏读不可重复读幻读
读未提交允许允许允许
读已提交禁止允许允许
可重复读禁止禁止允许

第四章:安全高效使用ExecuteDelete的最佳实践

4.1 结合事务确保批量操作的原子性

在批量数据处理中,原子性是保障数据一致性的核心。通过数据库事务,可确保一组操作要么全部成功,要么全部回滚。
事务控制批量插入
使用事务封装多条插入语句,避免部分写入导致的数据不一致。以下为 Go 语言示例:
tx, err := db.Begin()
if err != nil {
    return err
}
defer tx.Rollback()

stmt, err := tx.Prepare("INSERT INTO users(name, email) VALUES(?, ?)")
if err != nil {
    return err
}
for _, u := range users {
    _, err := stmt.Exec(u.Name, u.Email)
    if err != nil {
        return err // 自动触发 Rollback
    }
}
return tx.Commit() // 提交事务
上述代码中,db.Begin() 启动事务,所有插入操作在 tx 上执行。若任意一步失败,defer tx.Rollback() 确保数据回滚;仅当全部成功时,Commit() 持久化变更。
优势分析
  • 保证批量操作的原子性与一致性
  • 减少数据库连接开销,提升性能
  • 支持回滚机制,增强系统容错能力

4.2 配合日志记录实现删除行为可追溯

在数据敏感的系统中,物理删除操作必须被严格审计。通过引入操作日志机制,可确保每次删除行为均被记录,实现追溯能力。
日志记录关键字段
  • 操作人:执行删除的用户身份
  • 操作时间:精确到毫秒的时间戳
  • 目标资源:被删除的数据ID及类型
  • 客户端IP:请求来源地址
代码实现示例
func DeleteUser(id int, operator string, ip string) error {
    logEntry := AuditLog{
        Action:     "DELETE_USER",
        TargetID:   id,
        Operator:   operator,
        IP:         ip,
        Timestamp:  time.Now(),
    }
    if err := WriteAuditLog(logEntry); err != nil {
        return err
    }
    return db.Delete(&User{}, "id = ?", id).Error
}
上述函数在执行数据库删除前,先将操作信息写入审计日志表。WriteAuditLog 确保日志持久化,即使后续删除失败,操作痕迹仍可查。参数 operator 和 ip 来源于认证上下文与 HTTP 请求头,保障信息真实性。

4.3 利用过滤策略避免误删关键数据

在数据清理流程中,误删关键记录是常见风险。通过构建精细化的过滤策略,可有效识别并保护核心数据。
基于标签的保留规则
使用元数据标签标记关键数据集,确保自动化脚本跳过处理。例如:

# 定义保留标签集合
protected_tags = {"critical", "backup", "compliance"}

for dataset in all_datasets:
    if dataset.metadata.tags & protected_tags:
        continue  # 跳过关键数据
    else:
        schedule_for_cleanup(dataset)
上述代码通过集合交集判断是否包含保护标签,逻辑简洁且高效。
多级确认机制
  • 第一层:自动扫描带保护标签的资源
  • 第二层:对无标签资源进行访问频率分析
  • 第三层:生成待删清单前需人工审批
该策略显著降低误操作概率,保障数据安全与业务连续性。

4.4 在复杂业务中与软删除机制协同设计

在高并发、多模块耦合的系统中,软删除需与事件驱动架构协同设计,避免状态不一致。通过引入“逻辑删除+异步归档”策略,可保障业务完整性。
事件触发与数据一致性
用户删除操作触发领域事件,通知下游服务同步更新状态:
// 发布软删除事件
type UserDeletedEvent struct {
    UserID    uint      `json:"user_id"`
    DeletedAt time.Time `json:"deleted_at"`
}

func (s *UserService) DeleteUser(id uint) error {
    user, _ := s.repo.FindByID(id)
    user.Status = "inactive"
    user.DeletedAt = time.Now()
    s.repo.Save(user)
    s.eventBus.Publish(&UserDeletedEvent{UserID: id, DeletedAt: user.DeletedAt})
    return nil
}
上述代码中,DeletedAt 非空表示软删除,事件总线确保消息最终一致性。
查询过滤统一拦截
使用全局查询中间件自动附加 WHERE deleted_at IS NULL 条件,避免遗漏。
  • 所有读取接口默认屏蔽已删除记录
  • 管理后台可通过显式参数绕过过滤

第五章:未来展望与替代方案思考

云原生架构的演进趋势
随着 Kubernetes 成为容器编排的事实标准,微服务治理正向服务网格(Service Mesh)深度迁移。Istio 和 Linkerd 已在生产环境中验证其流量控制与安全能力。例如,某金融企业通过引入 Istio 实现灰度发布,将版本切换错误率降低 76%。
  • Sidecar 注入自动化可通过准入控制器实现
  • 可观测性集成需结合 Prometheus 与 OpenTelemetry
  • 零信任安全模型依赖 mTLS 与细粒度授权策略
边缘计算场景下的技术选型
在物联网数据处理中,传统中心化架构延迟过高。采用 KubeEdge 可将 Kubernetes 原语扩展至边缘节点。某智能交通系统部署 KubeEdge 后,路口信号优化响应时间从 800ms 降至 120ms。
方案延迟 (ms)运维复杂度适用场景
中心化处理800低非实时分析
KubeEdge + 边缘AI120中实时决策
Serverless 架构的实践路径
针对突发流量业务,如电商大促,基于 Knative 的自动伸缩可节省 40% 资源成本。以下代码展示了事件驱动函数的定义方式:
// event-handler.go
package main

import (
	"context"
	"fmt"
	"log"
)

func Handle(ctx context.Context, event []byte) error {
	log.Printf("Received: %s", string(event))
	// 处理订单、触发通知等业务逻辑
	fmt.Println("Processing high-traffic event...")
	return nil
}
产业园区如何高效对接企业技术需求与高校科研成果?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

EFCore数据的增删改查EFCore的实体类配置

EFCore中也是采用约定大于配置的原则,EFCore会默认按照约定根据实体类以及DbContext的定义类实现和数据库表的映射配置,除非我们显示指定了配置规则,比如上一篇的ToTable("T_Books")1.作为ORM框架,EFCore要完成实体类对象和数据库中数据关系的映射,也就是实体类与数据库表的映射,以及实体类的属性与数据库表的列的映射。2.数据库表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型兼容的类型。EFCore中的默认的规则约定有很多,这里只列出一些主要的约定规则。

qq_71012549的博客 2312

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

二、EFCore系列之增删改查

2. ExecuteDelete :是版本 7.0 开始引入的一个新功能,允许你根据给定的条件直接从数据库中删除匹配的记录,而不需要先将这些记录加载到应用程序内存中。直接在数据库上执行的操作,一旦执行就无法撤销。2. ExecuteUpdate :是版本 7.0 开始引入的一个新功能,对满足特定条件的所有记录进行批量更新,而不需要先将它们加载到内存中。1. 查询第一条数据。

weixin_45666156的博客 1070

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 183

PowerDesigner16.5下载和安装教程

一、软件下载 1.下载地址(不用复制,直接点击下载链接即可):链接:https://pan.baidu.com/s/1MSnWHWt3SO2Uz5dt9AANAg提取码:z9kk 二、软件安装 1.下载安装包(包含安装文件、汉化包、注册文件) 2.下载后文件内容如下 3....

cicong2374的博客 10万+

EF CORE DELETE

public void Delete() { testDbContext.Order.Remove(testDbContext.Order.Find(1006)); testDbContext.SaveChanges(); } 这种方式会执行两次sql语句,第一次是将实体查询出来,第二次是执行删除语...

张峰的博客 3811

实战指南:用Python实现ONVIF WS-Discovery设备发现(附完整代码)

本文提供了一份详细的实战指南,介绍如何使用Python实现基于ONVIF标准的WS-Discovery设备发现协议。文章深入解析了协议原理、网络通信模型,并提供了完整的代码实现,帮助开发者快速构建智能安防和物联网应用中的设备自动发现工具,有效提升网络设备集成与管理的效率。

chair的专栏 1114

ASP.NET Core 3.1系列(20)——EFCore中的删除实体操作

前一篇博客介绍了EFCore中添加实体的相关内容,本文开始介绍与之对应的删除实体操作。本文主要介绍了EFCore中删除实体的相关内容。在数据量较大的情况下,开发者可以考虑使用使用原生SQL或借助于第三方库实现大批量数据的删除操作。

HerryDong的博客 1885

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1806

(EF Core 7+ 批量删除终极方案):ExecuteDelete全攻略与性能压测报告

掌握EF Core的批量删除ExecuteDelete高效方案,告别低性能循环删除。适用于大数据量场景,基于EF Core 7+原生支持,无需第三方库,显著提升删除性能。操作简洁安全,附实测性能对比,值得收藏。

FuncFun的博客 654

239号资源-simulink仿真:MATLAB/Simulink教程(PDF文档)-----已提供下载资源

电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。

LIANG674027206的博客 1076

EF Core深度实战:从契约编译到生产级性能优化

Entity Framework Core(EF Core)本质上是一个对象-关系契约编译器,而非简单的ORM封装工具。它通过模型构建、查询翻译与变更追踪三阶段,将C#领域模型编译为可执行的关系型操作指令。理解其‘契约编译’本质,是规避N+1查询、导航属性膨胀、并发超卖等高频问题的前提;而掌握AsNoTracking、Select投影、ExecuteUpdate等关键机制,则直接决定高并发、大数据量场景下的吞吐与稳定性。本文聚焦EF Core在金融、电商等中大型系统中的真实落地经验,覆盖性能调优、迁移治理、

weixin_40192258的博客 420

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

Android 13.0 USB 麦克风音频采集优化:解决延时、杂音和无声问题

摘要:本文针对Android智能会议设备中USB麦克风存在的三大问题(录音延时、概率性杂音和无声)进行了深入分析和优化。通过预填充静音帧降低90%启动延时,分离采集/播放互斥锁消除杂音,采用持久化配置解决无声问题,并新增状态通知机制提升用户体验。优化后测试显示:录音延时从1200-2000ms降至100-200ms,故障率降至0%,CPU占用降低30%。该方案适用于各类USB音频设备和视频会议系统,为低延时音频采集提供了可靠解决方案。

ip0417的博客 229

删除EF Core6中的所有行

我们可能需要使用EF Core从表中删除所有记录。在本文中,我们将检查替代选项,例如运行截断/删除命令和单元测试选项。

寒冰屋的专栏 1362

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Entity Framework Core 关联删除

关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征;即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值。 数据库关联删除行为 我们先来看一看SQL Server中支持的行为。在创建外键约束时,可以指定关联表在主表删除行时,对依赖的数据如何执行操作。例如下面的SQL语句,[Order Details]表中[OrderID]字段 是...

weixin_30729609的博客 524

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ASP.NET Core 和 EF Core系列教程——CRUD

ASP.NET Core 和 Entity Framework Core系列教程——CRUD (2 / 10) CRUD 为创建、读取、更新、删除的英文首字母的缩写 作者:Tom Dykstra和Rick Anderson Contoso 大学示例 web 应用程序演示了如何使用 Entity Framework Core 和 Visual Studio 创建 ASP.NET Core

若即的专栏 7173

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

EFCore查询语句生成流程、让EFCore支持批量Update/Delete/MergeInto

引子之前发现了一款叫 EFCore.BulkExtensions 的 nuget 包。里面提供了大量的 BulkInsertOrUpdateOrDelete 和 BatchUpdate...

dotNET跨平台 1989

ASP.NET Core MVC 和 EF Core 教程 - 创建、读取、更新和删除

作者:Tom Dykstra 和 Rick AndersonContoso 大学示例 web 应用程序演示如何使用 Entity Framework Core 和 Visual Studio 创建 ASP.NET Core MVC web 应用程序。 若要了解教程系列,请参阅本系列中的第一个教程。在上一个教程中,创建了一个使用 Entity Framework 和 SQL Server Local...

xiaohuaduoer的博客 6697

EF 两种删除方式的比较

UserInfo user = from u in context.UserInfo where u.Id=343 select u;context.UserInfo.Remove(user); 用Remove()方法时,必须先从EF中查到才能删除UserInfo user = new UserInfo(){Id=343};context.Entry&lt;UserInfo&gt;(user).S...

dxm809的博客 1万+

EFCore中增删改查的方法

public class EFDao&lt;T&gt; : IDao&lt;T&gt; where T : class { private EnergyIotDbContext db; public EFDao(EnergyIotDbContext _db) { db = _db; } ...

milo0305 1万+

EF Core之全局删除方案

EF Core之全局删除方案 本文主要对EF Core的级联删除和软删除的全局配置作说明 EF Core的外键默认是级联删除的,如果不想这样就只能手动配置,这里提供一种全局配置的方式: DBContext的OnModelCreating就是我们要处理的地方: protected override void OnModelCreating(ModelBuilder modelBuilde...

2ker的博客 3592
上一篇: 生产环境日志失控?ASP.NET Core LogLevel配置的4个黄金法则
下一篇: 你还在用过时的命名空间写法?Laravel 10路由新规范必须掌握的3个要点
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值