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
相关产品推荐
相关产品推荐

