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

EF Core:如何向一对多关系的导航属性中添加数据?

解决一对多关联录入时的空引用错误

你遇到的Object reference not set to an instance of an object错误,根源是Record类的permits集合未初始化。ICollection类型的导航属性默认值为null,直接调用Add方法会触发空引用异常。以下是几种可行的解决方式:

方法1:在Record构造函数中初始化集合

修改Record实体类,添加构造函数自动初始化permits集合,确保每次实例化Record时集合都处于可用状态:

[Table("record" , Schema = "public")]
public class Record
{
    public Record()
    {
        // 初始化集合为List实例
        permits = new List<Permit>();
    }

    [Key]
    public string Serial_Num {get; set;}
    public string job_nature {get; set;}
    //navigation property
    public ICollection<Permit> permits {get; set;}
}

之后你的测试代码无需额外修改,就能正常调用objRecord.permits.Add(objPermit)。

方法2:实例化Record后手动初始化集合

如果不想修改实体类结构,可在测试代码中手动为permits赋值:

// Record Class
Record objRecord = new Record();
objRecord.Serial_Num = "001";
objRecord.job_nature = "test";
// 手动初始化集合
objRecord.permits = new List<Permit>();

// Permit Class
Permit objPermit = new Permit();
objPermit.Serial_Num = objRecord.Serial_Num;
objPermit.permit = "permit_test";

objRecord.permits.Add(objPermit);
context.record.Add(objRecord);
context.SaveChanges();

额外优化:利用EF Core导航属性自动关联

无需手动设置外键Serial_Num,直接为Permit的Record属性赋值,EF Core会自动处理外键关联,代码更简洁且不易出错:

// Record Class
Record objRecord = new Record();
objRecord.Serial_Num = "001";
objRecord.job_nature = "test";
objRecord.permits = new List<Permit>();

// Permit Class
Permit objPermit = new Permit();
objPermit.permit = "permit_test";
// 直接关联Record实体
objPermit.Record = objRecord;

objRecord.permits.Add(objPermit);
context.record.Add(objRecord);
context.SaveChanges();

内容的提问来源于stack exchange,提问作者AsM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:25:17