NHibernate配置正确但实体映射异常:子类集合归属错误
排查与解决建议
核心问题原因
你的集合映射未针对子类的鉴别器值添加过滤条件,NHibernate默认会把所有关联的ProductPrice子类实例加载到集合中,不会自动根据鉴别器区分,导致本该属于ProductPrice_B的实例被混入ProductPrice_A集合。
具体修复步骤
修改ProductPricesMapping中的集合映射,为每个HasMany添加鉴别器过滤条件:
public class ProductPricesMapping : ClassMap<ProductPrices> { public ProductPricesMapping() { // 省略其他映射 HasMany(x => x.ProductPrice_A) .Cascade.AllDeleteOrphan() .Inverse() .Where("discriminator = 1"); // 匹配ProductPrice_A的鉴别器值 HasMany(x => x.ProductPrice_B) .Cascade.AllDeleteOrphan() .Inverse() .Where("discriminator = 0"); // 匹配ProductPrice_B的鉴别器值 // 省略其他映射 } }
额外排查点
- 验证基类映射的鉴别器列名是否完全匹配数据库字段:确保
DiscriminateSubClassesOnColumn("discriminator")中的列名和数据库实际列名一致(注意大小写、拼写)。 - 核对子类鉴别器值类型:如果数据库中
discriminator列是字符串类型,映射里的DiscriminatorValue要写字符串(比如"1"而不是1),反之如果是数值类型则用数值。 - 查看NHibernate SQL日志:开启日志输出,检查加载集合时生成的SQL语句,确认是否包含了鉴别器过滤条件,若没有则说明映射的过滤规则未生效。
- 检查实体继承关系:确认
ProductPrice_A和ProductPrice_B仅直接继承自ProductPrice,没有其他子类或错误的继承层级干扰。 - 确认关联双向绑定:检查
ProductPrice_A和ProductPrice_B类中是否正确包含ProductPrices的引用属性,且在保存实例时已正确设置该关联(Inverse()要求关联由子端维护)。
内容的提问来源于stack exchange,提问作者Angelo Fuller
相关产品推荐
相关产品推荐

