NHibernate映射多个关系

时间:2011-03-25 05:02:21

标签: c# .net nhibernate nhibernate-mapping

以下方案的正确HBM映射是什么?

我需要将数据库中的ValueItem限定为Income或Expense项目,以便NHibernate在加载时将其加载到正确的列表中。

问题是:从数据库中检索Container时,IncomeItems和ExpenseItems集合的匹配项是相同的。

Design

C#

public class Container
{
    public virtual IList<ValueItem> IncomeItems { get; set; }
    public virtual IList<ValueItem> ExpenseItems { get; set; }
}

public class ValueItem
{
    public virtual double Amount { get; set; }
    public virtual string Description { get; set; }
}

HBM

<class name="Container">
    <id name="Id">
        <generator class="hilo" />
    </id>

    <list name="IncomeItems " cascade="all-delete-orphan">
        <key column="ContainerId" />
        <index column="ItemIndex" />
        <one-to-many class="ValueItem"/>
    </list>

    <list name="ExpenseItems " cascade="all-delete-orphan">
        <key column="ContainerId" />
        <index column="ItemIndex" />
        <one-to-many class="ValueItem"/>
    </list> 
</class>


<class name="ValueItem">
    <id column="Id" type="int">
      <generator class="hilo" />
    </id>

    <property name="Amount" />
    <property name="Description" />
</class>    

2 个答案:

答案 0 :(得分:1)

Don on NHUsers的答案解决了我的问题:

唐的答案是:

我有一个类似的映射到你的,除了我使用包而不是列表,我有inverse =“true”,级联设置为默认值,我显式设置表名,我有每个键的不同列名,我的参考文献回到了什么是你的容器,每个容器都有唯一的名称。也许它是逆=真或不同 列名。

对于hokey类名称感到抱歉。我当场改变了它们的真实对象名称,我感觉不是很有创意。 希望这会有所帮助,

<class name="Form" >
    <many-to-one name="CreatorPerson" class="Person" />
    <many-to-one name="ProcessorPerson" class="Person" />
</class>

<class name="Person">
    <bag name="FormsCreated" inverse="true">
        <key>
            <column name="CreatorPersonId" not-null="true" />
        </key>
        <one-to-many class="Person" />
    </bag>
    <bag name="FormsToProcess" inverse="true">
        <key>
            <column name="ProcessorPerson" not-null="true" />
        </key>
        <one-to-many class="Person" />
    </bag>
</class> 

答案 1 :(得分:0)

您可以选择合适的继承策略: http://nhibernate.info/doc/nh/en/index.html#inheritance

或者,如果您的架构无法更改。您可以在列表映射中指定where属性。这些将指定如何获取它们。