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
相关产品推荐
相关产品推荐

