无法加载销售订单行关联的采购订单行列表问题
问题分析与解决方案
你的核心问题是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
相关产品推荐
相关产品推荐

