NHibernate:尽管配置正确,但实体映射不正确

问题描述 投票:0回答:1

我面临 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
集合关联起来,并且希望获得有关如何排查和解决此问题的任何见解或建议。

c# orm nhibernate fluent-nhibernate
1个回答
0
投票

看起来像以下问题:https://github.com/nhibernate/nhibernate-core/issues/1248

作为一种解决方法,您可以通过在鉴别器映射上添加

AlwaysSelectWithValue()
(xml 映射中的
force="true"
属性)来强制向查询添加鉴别器值:

  public ProductPriceMapping()
    {
        DiscriminateSubClassesOnColumn("discriminator")
               .AlwaysSelectWithValue();

...
© www.soinside.com 2019 - 2024. All rights reserved.