sqlsugar insertnav时 Object reference not set to an instance of an object

{
  "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))一起配合才能映射成功。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值