我面临 NHibernate 的问题,尽管配置似乎正确,但实体映射不正确。以下是该场景的摘要:
我有一堂课
ProductPrices
,有两个集合:
public virtual IList<ProductPrice_A> ProductPrice_A { get; set; }
public virtual IList<ProductPrice_B> ProductPrice_B { get; set; }
在
ProductPrices
的映射中,我定义了集合,如下所示:
public class ProductPricesMapping : ClassMap<ProductPrices>
{
public ProductPricesMapping()
{
// Other mappings omitted for brevity
HasMany(x => x.ProductPrice_A).Cascade.AllDeleteOrphan().Inverse();
HasMany(x => x.ProductPrice_B).Cascade.AllDeleteOrphan().Inverse();
// Other mappings omitted for brevity
}
}
此外,还有子类
ProductPrice_A
和 ProductPrice_B
及其各自的映射,其中包括鉴别器值和其他属性。
查询
ProductPrices
类型的实体时会出现问题。尽管映射配置正确,所有实体都被添加到 ProductPrice_A
集合中,即使有些实体应该属于 ProductPrice_B
集合。
我已经验证了数据库中的数据,一切似乎都是正确的。鉴别器值和关联似乎与 NHibernate 映射一致。
以下是其他映射供参考:
public class ProductPrice_AMapping : SubclassMap<ProductPrice_A>
{
public ProductPrice_AMapping()
{
Map(x => x.Description).Not.Nullable();
DiscriminatorValue(1);
}
}
public class ProductPrice_BMapping : SubclassMap<ProductPrice_B>
{
public ProductPrice_BMapping()
{
Map(x => x.Description).Not.Nullable();
DiscriminatorValue(0);
}
}
public class ProductPriceMapping : ClassMap<ProductPrice>
{
public ProductPriceMapping()
{
DiscriminateSubClassesOnColumn("discriminator");
Id(x => x.Id).Not.Nullable();
Map(x => x.CreateDate).Not.Nullable();
Map(x => x.ModificationDate).Not.Nullable();
Map(x => x.Discriminator).Nullable();
References(x => x.ProductPrices).Not.Nullable().Cascade.SaveUpdate();
Map(x => x.Price).Nullable();
}
}
我很困惑为什么 NHibernate 没有正确地将实体与
ProductPrice_B
集合关联起来,并且希望获得有关如何排查和解决此问题的任何见解或建议。
看起来像以下问题:https://github.com/nhibernate/nhibernate-core/issues/1248
作为一种解决方法,您可以通过在鉴别器映射上添加
AlwaysSelectWithValue()
(xml 映射中的 force="true"
属性)来强制向查询添加鉴别器值:
public ProductPriceMapping()
{
DiscriminateSubClassesOnColumn("discriminator")
.AlwaysSelectWithValue();
...