Entity Framework 6种子数据未生成问题求助
EF6迁移后种子数据不生效的解决方案及方法解析
一、为什么你的种子数据没生效?
当你使用Code First Migrations(也就是enable-migrations、Add-Migration、Update-database这些命令)时,EF6会默认启用MigrateDatabaseToLatestVersion初始化器,你自定义的DropCreateDatabaseIfModelChanges初始化器会被迁移系统覆盖,不会自动触发其Seed方法。这就是数据表能创建但种子数据没填充的核心原因。
二、迁移场景下正确的种子数据填充方式
迁移场景下,官方推荐使用自动生成的Configuration类的Seed方法来处理种子数据,步骤如下:
- 找到执行
enable-migrations后生成的Configuration.cs文件(通常在Migrations文件夹下) - 在它的
Seed方法中添加种子数据,建议使用AddOrUpdate避免重复插入:
protected override void Seed(EmployeeDBContext context) { // 根据FirstName判断数据是否存在,不存在则添加,存在则更新 context.Employees.AddOrUpdate( e => e.FirstName, new Employee { FirstName = "Mark" }, new Employee { FirstName = "Ben" }, new Employee { FirstName = "John" } ); // 将变更提交到数据库 context.SaveChanges(); }
- 重新执行迁移命令:
Update-Database
完成后种子数据就会被正确填充到数据库中。
三、context.SaveChanges()与base.Seed(context)的区别
context.SaveChanges():这是DbContext的核心方法,负责将内存中所有未提交的实体变更(新增、修改、删除)转化为SQL语句并提交到数据库。你在自定义Seed里调用它,就是手动触发数据持久化操作。base.Seed(context):你的基类DropCreateDatabaseIfModelChanges的Seed方法是EF6框架默认的空实现,没有任何逻辑,所以你注释掉或者调用它都不会产生任何影响。只有当你自己重写了基类的Seed方法时,调用base.Seed才会执行基类的自定义逻辑。
四、关于初始化器的额外说明
如果坚持想用DropCreateDatabaseIfModelChanges的Seed方法,需要禁用Code First Migrations(删除Migrations文件夹,不再使用迁移命令),此时EF会在模型变更时重建数据库并触发Seed方法。但这种方式仅适合开发阶段快速重建数据库的场景,不适合需要增量更新的生产环境。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

