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

NHibernate多对多关联映射出现'Produkt_P_ID列已添加'错误求助

问题根因
  • 复合主键配置标签错误:多字段的联合主键需要用<composite-id>标签,你当前用的<id>标签仅支持单字段主键
  • 字段重复映射:你已经在主键配置中声明了Produkt_P_ID、Haendler_H_ID两个属性,后续又单独添加了同名的<many-to-one>配置,导致NHibernate生成SQL时重复添加同名字段,直接触发你遇到的列重复错误
  • 主键关联属性配置错误:复合主键中如果对应关联实体,不能使用<key-property>(仅支持值类型字段),需要用<key-many-to-one>同时完成主键和外键的映射
修正方案

1. 修正映射配置

替换你原来的hbm映射文件内容为以下版本:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="SelfHost"
                   namespace="SelfHost.Core.Repository.implementation">
    <class name="HibernateProduktHaendler" table="ProduktHaendler">
        <!-- 声明联合主键,用key-many-to-one同时映射关联和主键约束 -->
        <composite-id>
            <key-many-to-one name="Produkt_P_ID" class="HibernateProdukt" column="Produkt_P_ID"/>
            <key-many-to-one name="Haendler_H_ID" class="HibernateHaendler" column="Haendler_H_ID"/>
        </composite-id>
        <property name="ProduktURL" />
        <!-- 删掉重复的many-to-one配置,已经在composite-id中完成映射 -->
    </class>
</hibernate-mapping>

2. 实体类可选优化(避免空引用异常)

你当前的GetHashCode方法在关联属性未赋值时会触发空引用,可调整为:

public override int GetHashCode()
{
    unchecked
    {
        int hash = 17;
        hash = hash * 23 + (Produkt_P_ID?.GetHashCode() ?? 0);
        hash = hash * 23 + (Haendler_H_ID?.GetHashCode() ?? 0);
        return hash;
    }
}

Equals方法也可以同步调整空判断逻辑,避免空引用报错。

补充说明

因为你的中间表ProduktHaendler存在额外字段ProduktURL,所以必须使用当前的中间实体映射方式,不能直接用NHibernate自带的无中间实体的多对多映射,上述修正后即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:00:02