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 是快刀斩乱麻的工具,够用但不健壮;真要长期维护,迁移才是正解。
