EnsureDeleted和EnsureCreated适用于开发测试,前者彻底删除整个数据库,后者仅在空库时建库建表;二者均不走迁移流程、不支持增量更新,生产环境禁用;长期维护应使用Migrations。

EF Core 提供了 EnsureDeleted 和 EnsureCreated 这两个便捷方法,适合开发和测试阶段快速清理或初始化数据库。它们不走迁移流程,而是直接操作数据库结构,简单直接但需谨慎使用。
EnsureDeleted:彻底删除整个数据库
调用 context.Database.EnsureDeleted() 会尝试删除当前连接字符串指向的**整个数据库**(包括所有表、索引、约束等)。如果数据库不存在,不报错;如果无删除权限,则抛出异常。
- 适用于本地开发、单元测试前重置环境
- 不会保留任何数据或结构,删库跑路级操作
- 不依赖迁移历史,也不检查模型是否变更
- 注意:生产环境绝对禁用
EnsureCreated:仅在库为空时建库建表
context.Database.EnsureCreated() 会检查数据库是否存在且是否为空(即不含任何用户表)。只有当数据库**完全不存在**或**存在但没有任何表**时,才会创建数据库并根据当前模型生成全部表结构。
- 一旦数据库里有任意一张表(哪怕不是你 DbContext 管理的),它就什么也不做
- 不支持增量更新:模型改了字段,它不会修改已有表,也不会报错
- 没有迁移记录,无法回滚,不适合版本演进场景
- 常用于原型验证、内存数据库(InMemory)或极简示例
这两个方法的典型组合用法
开发调试中常用“先删后建”来获得干净起点:
context.Database.EnsureDeleted(); context.Database.EnsureCreated();
但要注意:这会丢失所有数据,且不能保证表结构与最新模型完全一致(比如缺少外键、索引或自定义约束)。
比 EnsureCreated 更靠谱的初始化方式
若需要模型变更也能自动同步结构,应改用迁移(Migrations):
- 运行
Add-Migration Init创建初始迁移 - 再执行
Update-Database应用到数据库 - 后续模型变更只需新增迁移 + 更新,安全可控
- 还可导出 SQL 脚本:
Script-Migration
基本上就这些。EnsureDeleted/EnsureCreated 是快刀斩乱麻的工具,够用但不健壮;真要长期维护,迁移才是正解。










