.NET Core中如何为多张数据表(含Cities表)植入种子数据
问题
- 在现有代码基础上需要向名为
Cities的新数据表植入种子数据,不确定具体实现方案 - 不清楚种子代码的存放位置,不确定是否需要单独创建新的
Seed文件实现逻辑
现有Countries表的种子实现代码:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Domain; namespace Persistence { public class Seed { public static async Task SeedData(DataContext context) { if(context.Countries.Any()) return; var countries = new List<Country> { new Country { Name = "Albania", CountryCode = "AL" }, new Country { Name = "France", CountryCode = "FR" }, new Country { Name = "Germany", CountryCode = "DE" } }; await context.Countries.AddRangeAsync(countries); await context.SaveChangesAsync(); } } }
Cities表包含2个字段:
CityName CityCode
实现方案
不需要单独新建Seed文件,直接在现有Seed类的SeedData方法中追加Cities表的种子逻辑即可,和项目现有代码结构保持一致。
需要注意原有代码的逻辑缺陷:原逻辑只要检测到Countries表有数据就直接return,会导致后续新增的其他表种子逻辑永远无法执行,需要把单表的提前返回逻辑,改成每个表独立判断是否需要写入种子数据。
具体修改步骤:
- 移除原方法中
if(context.Countries.Any()) return;的全局返回逻辑,改为针对单表的独立判断 - 为Countries表增加独立的空值判断,仅当表内无数据时才写入国家种子
- 新增Cities表的空值判断,初始化城市数据列表,为
CityName、CityCode字段赋值后批量写入 - 所有表的种子数据准备完成后,统一调用
SaveChangesAsync持久化到数据库,减少数据库连接开销
修改后的完整代码参考:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Domain; namespace Persistence { public class Seed { public static async Task SeedData(DataContext context) { // 写入国家表种子 if(!context.Countries.Any()) { var countries = new List<Country> { new Country { Name = "Albania", CountryCode = "AL" }, new Country { Name = "France", CountryCode = "FR" }, new Country { Name = "Germany", CountryCode = "DE" } }; await context.Countries.AddRangeAsync(countries); } // 写入城市表种子 if(!context.Cities.Any()) { var cities = new List<City> { new City { CityName = "Tirana", CityCode = "TIA" }, new City { CityName = "Paris", CityCode = "PAR" }, new City { CityName = "Berlin", CityCode = "BER" } // 可按需追加更多城市数据 }; await context.Cities.AddRangeAsync(cities); } // 统一持久化所有种子数据 await context.SaveChangesAsync(); } } }
注意:如果
Cities表和Countries表存在外键关联,需要确保国家数据先完成保存,再给城市数据关联对应的CountryId字段后写入,避免触发外键约束错误。
内容的提问来源于stack exchange,提问作者samgear
相关产品推荐
相关产品推荐

