{
"subject": 0,
"ordersId": 656116055519301,
"ordersCode": "",
"custmerId": 0,
"custmerName": "",
"invoiceAmount": 0,
"invoiceType": 0,
"deliverType": 0,
"salesManId": 1300000000111,
"salesMan": "系统管理员",
"chargePersonId": 1300000000111,
"chargePerson": "系统管理员",
"invoiceCompanyId": 0,
"invoiceCompanyName": "string",
"accountName": "string",
"bankNumber": "string",
"bankName": "string",
"phone": "string",
"fax": "string",
"invoiceImage": "",
"quality": 2,
"qualityNumber": "",
"remark": "string",
"status": 0,
"Crm_Fina_Invoice_Req_Record": [
{
"invoiceReqId": 0,
"ordersId": 656116055519301,
"ordersCode": "",
"makeDate": "2025-04-17 09:35:55.368",
"invoiceCodeNum": "",
"expNum": "",
"status": 0,
"invoiceAtt": "string"
}
]
}
sqlsugar 在试用 insertnav方法插入主表业务和子表业务时报错 Object reference not set to an instance of an object。又没有指向具体是实体问题还是SqlSugarRepository 的问题。
跟了几趟,没有找到更详细的报错内容。那最笨的解决思路,只能用排除法,先尝试用别的接口比如 page查询列表接口,证明SqlSugarRepository对象是不是有问题。如果其他接口能正常使用,那说明我们的数据仓储对象没有问题。剩下的就是需要排除插入的input实体的问题了。
我的input实体是包含子表的,是做的导航插入insertnav。那我先去掉子表的include 插入,改为普通插入 insertable,看看是不是有问题。结果这样一操作就可以正常执行插入了。 这下就简单了,只需要去找input数据包的子表里几个字段内容是不是有问题就可以了。可是,请继续往下看。
然后我查了子表的所有字段内容,是否必填等,都没发现问题,最后尝试改主表的entity当中的子表映射关系时,发现了问题。 通常情况下,我们设置主表跟子表的导航关系是OneToMany,但是我这里业务要求是OneToOne, 就因为这个OneToOne让导航插入失败报了上面的错误。
然后仔细分析,既然是NavigateType.OneToOne,那是不是下面的字段类型就不应该用List,去掉List就好了。从sqlsugar官网上查询得到验证是这样的,如下面第3张图所示。 这样的话,就要吧input、output和entity实体中对子表的映射都去掉list,包括相关方法都改掉。
然后你以为可以了吧, 好像官网也是这么做的,别急,还是同样的错误,还有但是。
前面配置了onetoone,List映射改成单实体映射,还是报对象未引用,经过一番测试,又发现新的问题需要修改。
[Navigate(NavigateType.OneToOne, nameof(Id), nameof(crm_fina_invoice_req_record.InvoiceReqId))]
在主表映射子表的导航属性里面,还要指定主表的ID(nameof(Id)),和子表的外键ID(nameof(crm_fina_invoice_req_record.InvoiceReqId))一起配合才能映射成功。