.NET Core中使用Seed添加新数据时保留原有数据的方法
解决EF Core种子数据更新时丢失原有数据的问题
问题根源
你碰到的情况是因为EF Core的HasData()种子数据机制是基于主键匹配更新的——如果在新的迁移中,你修改了HasData的集合(比如只保留ID6的数据,或者直接覆盖了原有列表),EF Core会判定原有ID1-5的种子数据需要被移除,进而生成删除这些数据的迁移脚本。
解决步骤
保留原有种子数据并追加新条目
在OnModelCreating方法里,别替换原有的HasData集合,而是在ID1-5数据的基础上,直接加上ID6的新数据。示例代码:protected override void OnModelCreating(ModelBuilder modelBuilder) { // 保留ID1-5的原有种子数据 modelBuilder.Entity<YourEntity>().HasData( new YourEntity { Id = 1, /* 其他属性值 */ }, new YourEntity { Id = 2, /* 其他属性值 */ }, new YourEntity { Id = 3, /* 其他属性值 */ }, new YourEntity { Id = 4, /* 其他属性值 */ }, new YourEntity { Id = 5, /* 其他属性值 */ }, // 追加ID6的新数据 new YourEntity { Id = 6, /* 其他属性值 */ } ); }重新生成迁移脚本
执行以下命令生成新迁移,此时EF Core只会检测到新增的ID6数据,不会生成删除原有数据的操作:add-migration AddId6SeedData检查迁移脚本(关键)
打开生成的迁移文件,确认Up方法里只有针对ID6数据的Insert操作,没有针对ID1-5的Delete操作。如果发现有删除逻辑,说明你在HasData里误删了原有数据,回到第一步修正即可。更新数据库
执行更新命令,把新的种子数据写入数据库:update-database
额外提醒
- 如果你的种子数据是从外部配置(比如JSON文件)加载的,要确保加载逻辑是合并新旧数据,而非直接替换原有列表。
- 不要手动修改已经应用过的迁移文件,所有种子数据的变更都应该通过修改
OnModelCreating中的HasData配置,再重新生成新迁移来处理。
内容的提问来源于stack exchange,提问作者Jack Ray
相关产品推荐
相关产品推荐

