ASP.NET Core从外部JSON文件种子数据时报未将对象引用到实例错误
错误原因排查及解决办法
1. 反序列化空值触发异常
JsonSerializer.Deserialize方法在JSON内容为空、结构与schemedemet类不匹配、属性映射失败时会返回null,你未做非空校验直接将返回值传给HasData,是触发空引用错误的最常见原因。
修复方案:
public List<schemedemet> seedAllDemet() { var filePath = @"C:\Users\ADMIN\source\repos\Seed\Seed\Data\SeedData\schemedemat.json"; // 提前校验文件是否存在 if (!File.Exists(filePath)) { return new List<schemedemet>(); } using (StreamReader r = new StreamReader(filePath)) { string json = r.ReadToEnd(); // 增加反序列化非空兜底,同时开启属性大小写不敏感匹配,避免字段名大小写不一致导致反序列化失败 var datas = JsonSerializer.Deserialize<List<schemedemet>>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? new List<schemedemet>(); return datas; } }
2. 无键实体不支持HasData配置
你给schemedemet实体配置了HasNoKey(),而EF Core原生的HasData种子数据注入逻辑依赖实体主键生成匹配的SQL语句,无键实体调用HasData本身就会触发运行时异常。
修复方案:
放弃在OnModelCreating中配置无键实体的种子数据,改为应用启动、数据库初始化完成后手动批量插入:
// 程序启动逻辑中添加(ASP.NET Core示例) using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); // 判空避免重复插入 if (!dbContext.schemedemets.Any()) { var seedData = dbContext.seedAllDemet(); dbContext.schemedemets.AddRange(seedData); dbContext.SaveChanges(); } }
3. 绝对路径引发文件读取失败
你写死了本地绝对路径,当项目切换运行环境、换机器、发布部署时,JSON文件路径不匹配会导致读取失败,间接触发空引用。建议改为相对路径读取:
// 替换原来的硬编码路径,文件会从程序运行目录下读取 var filePath = Path.Combine(AppContext.BaseDirectory, "Data", "SeedData", "schemedemat.json");
同时需要在Visual Studio中右键选中JSON文件,打开属性面板,将「复制到输出目录」选项设置为「如果较新则复制」,确保编译后文件会被同步到运行目录。
内容的提问来源于stack exchange,提问作者rishi Vickey
相关产品推荐
相关产品推荐

