NHibernate отображение нескольких отношений - PullRequest
1 голос
/ 25 марта 2011

Какое правильное отображение HBM для сценария ниже?

Мне нужно квалифицировать ValueItem в базе данных как элемент дохода или расхода, чтобы NHibernate загружал его в правильный список при загрузкеit.

Проблема заключается в следующем: Контексты коллекций IncomeItems и ExpenseItems одинаковы при извлечении Container из БД.

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 ]

1 голос
/ 30 ноября 2012

Этот ответ от Дона на NHUsers решает мою проблему:

Ответ Дона:

У меня есть сопоставление, аналогичное вашему, за исключением того, что я использую сумки вместосписки, у меня inverse = "true", для каскада установлено значение по умолчанию, я явно устанавливаю имя таблицы, у меня разные имена столбцов для каждого ключа, и у меня есть ссылки на то, каким будет ваш контейнер с уникальными именами для каждого из них.Возможно, это обратное = true или разные имена столбцов.

Извините за названия классов хоккеистов.Я сменил их с имен объектов реального домена на месте, и я не чувствую себя очень креативным.Надеюсь, это поможет,

<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> 
0 голосов
/ 25 марта 2011

Вы можете выбрать подходящую стратегию наследования: http://nhibernate.info/doc/nh/en/index.html#inheritance

В качестве альтернативы, если ваша схема не может быть изменена.Вы можете указать where атрибутов в ваших списках.Они будут указывать, как их получить.

...