Entity Framework Core DB First 新手关于意外丢失数据的常见疑问
EF Core 数据删除相关问题解答
1. Database First 模式下未添加为DbSet的表是否会被自动DROP
不会。SaveChanges()的核心作用是提交上下文跟踪到的数据层面的增删改操作,本身不会主动修改数据库表结构。未在DbContext中注册为DbSet的表,EF Core 上下文完全不会感知其存在,除非你手动编写原生DROP TABLE的SQL执行,否则无论如何都不会触发这类表结构删除操作。
另外提醒下,Database First 场景下不要主动调用EnsureCreated()、Migrate()这类结构同步API,这类API是给Code First场景设计的,误调用才有可能修改表结构。
2. 空DbSet是否会触发对应表全量数据DELETE
不会。DbSet只是访问表数据的查询入口,EF Core 只会对被显式标记为Deleted状态的实体生成DELETE语句。哪怕你查询DbSet返回的结果集为空,或者从来没有对这个DbSet做过任何写入操作,只要没有调用Remove()、RemoveRange()方法标记实体删除,SaveChanges()不会生成任何针对该表的DELETE语句,不会影响表里的现有数据。
3. 意外数据丢失的常见陷阱
正常使用EF Core默认的跟踪式增删改逻辑时,所有硬删除都需要编写显式的删除代码才会执行,但确实存在几个容易被忽略的疏漏场景可能导致意外丢数据:
- 误调用结构操作API:比如不小心执行了
context.Database.EnsureDeleted()会直接删除整个库,Code First场景下执行包含DropTable、DropColumn的迁移文件也会丢失对应数据 - 级联删除默认约定:EF Core 默认对必填的外键关系开启级联删除,比如你删除一个部门实体时,该部门下关联的所有员工实体会被自动删除,如果你没意识到这个默认配置,很容易误删关联数据
- 原生SQL编写错误:手动编写执行DELETE的原生SQL时漏写WHERE条件,或者条件写错,会直接触发批量删除
- 第三方批量操作库误用:如果使用了支持批量删除的第三方EF Core扩展库,调用批量删除方法时漏加筛选条件,会直接清空整张表
内容的提问来源于stack exchange,提问作者hk1980
相关产品推荐
相关产品推荐

