以下方案的正确HBM映射是什么?
我需要将数据库中的ValueItem
限定为Income或Expense项目,以便NHibernate在加载时将其加载到正确的列表中。
问题是:从数据库中检索Container
时,IncomeItems和ExpenseItems集合的匹配项是相同的。
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>
答案 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
属性。这些将指定如何获取它们。