You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:54:04