C# NHibernate映射多个关系

C# NHibernate映射多个关系,c#,.net,nhibernate,nhibernate-mapping,C#,.net,Nhibernate,Nhibernate Mapping,以下场景的正确HBM映射是什么 我需要将数据库中的ValueItem限定为收入或支出项目,以便NHibernate在加载时将其加载到正确的列表中 问题是:从数据库检索容器时,IncomeItems和ExpenseItems集合的内容相同 C# 公共类容器 { 公共虚拟IList IncomeItems{get;set;} 公共虚拟IList ExpenseItems{get;set;} } 公共类价值项目 { 公共虚拟双金额{get;set;} 公共虚拟字符串描述{get;set;} } H

以下场景的正确HBM映射是什么

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

问题是:从数据库检索
容器时,IncomeItems和ExpenseItems集合的内容相同

C#

公共类容器
{
公共虚拟IList IncomeItems{get;set;}
公共虚拟IList ExpenseItems{get;set;}
}
公共类价值项目
{
公共虚拟双金额{get;set;}
公共虚拟字符串描述{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>    

您可以选择适当的继承策略:


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

您可以选择适当的继承策略:

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

此答案解决了我的问题:

唐的回答是:

我有一个类似于您的映射,除了我使用的是包而不是列表,我将inverse=“true”,cascade设置为默认值,我显式设置表名,每个键有不同的列名,并且我有引用返回到您的容器,每个容器都有唯一的名称。也许是相反的=真的或不同的 列名

关于hokey类名称,我很抱歉。我当场将它们从realdomain对象名中更改了出来,我觉得自己不是很有创意。 希望这有帮助

<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> 

这个答案解决了我的问题:

唐的回答是:

我有一个类似于您的映射,除了我使用的是包而不是列表,我将inverse=“true”,cascade设置为默认值,我显式设置表名,每个键有不同的列名,并且我有引用返回到您的容器,每个容器都有唯一的名称。也许是相反的=真的或不同的 列名

关于hokey类名称,我很抱歉。我当场将它们从realdomain对象名中更改了出来,我觉得自己不是很有创意。 希望这有帮助

<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> 


看起来它应该可以工作,它是否以某种方式工作,或者你到底在问什么?@R0MANARMY,问题是两个列表都填充了相同的数据。看起来它应该可以工作,它是否以某种方式工作,或者你到底在问什么?@R0MANARMY,问题是两个列表都填充了相同的数据。我曾想过用继承来解决这个问题,但这似乎是把它强加给了实际上并不需要它的东西。
where
子句是什么?在这种情况下,这两项之间没有区别?我可以在C侧区分,但在DB侧无法区分。有可能在映射中添加一个具有adefault值的属性,然后在该属性上添加到何处?@Philip如果在数据库端无法区分它,NHibernate也无法为您这样做。请记住,它仍然是数据库的接口。再次感谢您的回复。我理解你的说法。我想知道的是,是否有可能提供一个映射,可能类似于NHibernate中用于子分类的鉴别器。通过对NHibernate进行分类,可以进一步“装饰”表格以指示类型。显然,我不想在这里子类化,因为它是不需要的。这是一种常见的模式,必须有一种简单的方法来实现。顺便说一句,我知道它是数据库的接口。@Philip,子类化NHibernate并不能修饰表。该表仍然需要一个鉴别器列,用于确定类型。因此,如果您不能提供sql查询来区分收入项目和支出项目,那么NHibernate也无法做到这一点。如果唯一可以区分它们的方法是通过代码,则可以创建包含所有项的私有字段和能够区分这些项的公共访问器属性/方法,添加新的,等等@Philip Fourie:如果您希望确保不会从收入收集中取出记录,然后重新插入到支出列中,那么在这种情况下,您可能会受益于子类化。至少就收入和费用而言,我想不出这样一笔交易有效的理由。对于子类,您可以确保它们是物理上不同的类型,并且尝试这样做的代码不会被编译。我曾想过用继承来解决它,但这似乎是将它强制到不需要它的东西上。
where
子句是什么?在这种情况下,这两项之间没有区别?我可以在C侧区分,但在DB侧无法区分。有可能在映射中添加一个具有adefault值的属性,然后在该属性上添加到何处?@Philip如果在数据库端无法区分它,NHibernate也无法为您这样做。请记住,它仍然是数据库的接口。再次感谢您的回复。我理解你的说法。我想知道的是,是否有可能提供一个映射,可能类似于NHibernate中用于子分类的鉴别器。通过对NHibernate进行分类,可以进一步“装饰”表格以指示类型。很明显,我不想在这里作为它的子类