Nhibernate子类映射问题

Posted

技术标签:

【中文标题】Nhibernate子类映射问题【英文标题】:Nhibernate subclass mapping problem 【发布时间】:2009-11-07 21:33:29 【问题描述】:

我正在使用 nhibernate 子类映射来处理系统对象的描述。基本上想法是有一个描述类并通过具有特定于对象的子类来进行多态关联。我的代码将描述数据正确插入数据库;这意味着在我插入数据时正确创建了 ownerid 和 ownertype 列。

但是当我使用 nhibernate.load() 加载 Foo 对象时,nhibernate 没有使用 OwnerType 列来查询 Foo 的描述 - 它只是使用 ownerId 列查询描述表,这会产生冲突,因为在具有相同 id 但关联到不同所有者类型的表。

你能帮我找出为什么它不包括 ownerType 来描述负载查询吗?我该如何解决这个问题?谢谢!

public class Product : EntityBase

    public virtual string Name  get; set; 
    public virtual IList<ProductDescription> Descriptions  get; set; 


public class ProductDescription : Description

    public virtual Product Product  get; set; 


public class Description : EntityBase

    public virtual string Name  get; set; 
    public virtual string ShortDescription  get; set; 
    public virtual string LongDescription  get; set; 



<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test.Domain" assembly="Test.Domain">
    <class name="Test.Domain.Product, Test.Domain" table="Products">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="native" />
        </id>

        <property name="Name" />

        <bag name="Descriptions" inverse="true" cascade="all">
            <key column="OwnerID" />
            <one-to-many class="Test.Domain.ProductDescription, Test.Domain" />
        </bag>
    </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test.Domain" assembly="Test.Domain">
<class name="Test.Domain.Description, Test.Domain" table="Descriptions" discriminator-value="0">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="native" />
        </id>

        <discriminator column="OwnerType" />

        <property name="Name" />
        <property name="ShortDescription" />
        <property name="LongDescription" />

        <subclass name="Test.Domain.ProductDescription, Test.Domain" discriminator-value="1">
            <many-to-one name="Product" class="Test.Domain.Product, Test.Domain" column="OwnerID" not-null="true"></many-to-one>
        </subclass>
</class>
</hibernate-mapping>

【问题讨论】:

【参考方案1】:

在您的鉴别器映射上添加 force=true

&lt;discriminator column="OwnerType" force="true" /&gt;

这将确保将所有者类型添加到查询中

【讨论】:

以上是关于Nhibernate子类映射问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent NHibernate 自动映射禁用特定抽象基类的子类化

NHibernate 命名查询,每个子类都有表

NHibernate 预选?

Fluent NHibernate 实体 HasMany 不同子类类型的集合

如何查询 NHibernate 的特定类型?

您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?