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

无法加载销售订单行关联的采购订单行列表问题

问题分析与解决方案

你的核心问题是NHibernate无法正确加载OrderDocumentLine关联的DirectDeliveryPurchaseOrderLines集合,根源在于双向关联未完整配置,采购订单行实体缺少与销售订单行的显式关联映射,导致NHibernate无法识别关联关系。

步骤1:修正实体类定义

在PurchaseOrderDocumentLine中添加对OrderDocumentLine的引用,明确双向关联:

namespace Domain.Documents
{
    public class PurchaseOrderDocumentLine : DocumentLineBase
    {
        public PurchaseOrderDocumentLine()
        {
        }

        public virtual int DocEntry { get; set; }
        public virtual int LineNumber { get; set; }
        
        // 添加关联的销售订单行实体
        public virtual OrderDocumentLine DirectDeliveryOrderLine { get; set; }
    }
}

步骤2:调整NHibernate映射配置

1. 更新PurchaseOrderDocumentLine映射文件

替换原有的独立属性配置,改为关联映射,将BaseEntry/BaseLine绑定到销售订单行的复合主键:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Domain"
                   namespace="Domain.Documents">

    <class name="PurchaseOrderDocumentLine" table="por1">
        <composite-id>
            <key-property name="DocEntry"/>
            <key-property name="LineNumber" column="LineNum"/>
        </composite-id>
        <!-- 用many-to-one替代原BaseDocEntry、BaseLineNumber属性,建立关联 -->
        <many-to-one name="DirectDeliveryOrderLine" class="OrderDocumentLine" insert="false" update="false">
            <column name="BaseEntry"/>
            <column name="BaseLine"/>
        </many-to-one>
    </class>
</hibernate-mapping>

insert="false" update="false"是因为关联字段的维护由业务逻辑控制,不需要NHibernate自动修改。

2. 确认OrderDocumentLine映射配置

原集合配置逻辑正确,可添加可选的加载策略优化查询:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Domain"
                   namespace="Domain.Documents">
    <class name="OrderDocumentLine" table="rdr1">
        <synchronize table="por1"/>
        <composite-id>
            <key-property name="DocEntry"/>
            <key-property name="LineNumber" column="LineNum"/>
        </composite-id>
        <set name="DirectDeliveryPurchaseOrderLines" table="por1" inverse="true" fetch="select">
            <key>
                <column name="BaseEntry"/>
                <column name="BaseLine"/>
            </key>
            <one-to-many class="PurchaseOrderDocumentLine"/>
        </set>
    </class>
</hibernate-mapping>

关键注意点

  • inverse="true"表示关联关系的维护端在PurchaseOrderDocumentLine,NHibernate会通过采购订单行的DirectDeliveryOrderLine字段维护关联,而非销售订单行的集合。
  • 需确保数据库中por1表的BaseEntry、BaseLine字段与rdr1表的DocEntry、LineNum字段存在正确的数据关联,无无效值。
  • 若问题仍存在,可开启NHibernate SQL日志,查看生成的查询语句是否符合预期,排查数据或映射匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:16