много к одному и где пункт - PullRequest
0 голосов
/ 25 июля 2011

Я работаю над устаревшей базой данных, которая довольно сложна.
Таблица клиенты делятся с поставщиками, и те, кто создал эту структуру, использовали флаг для идентификации клиентов.Так как меня интересует только работа с записями, определенными как клиенты, я добавил в свое сопоставление условие where:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
    <class name="Customer" table="ANSADID" mutable="false" where="ANFCLI = 'Y'">
    <composite-id>
      <key-property name="CustomerCode" column="ANCOCO" type="String" length="10"></key-property>
      <key-property name="Company" column="ANCOSO" type ="String" length="5"></key-property>
    </composite-id>
    <property name="Name" column="ANINCO" type="String" length="100"></property>
  </class>
</hibernate-mapping>

Как видите, я предварительно отфильтровал всех своих клиентов с помощью этого предложения: ANFCLI = 'Y' Все отлично работает, если я опрашиваю клиентов (используется условие where):

var customers = session.QueryOver<Domain.Customer>()
    .Where(t => t.Company == "ABC01")
    .List();

Но если я опрашиваю таблицу заказов - где у меня связь «многие-к-одному»:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
  <class name="Order" table="OCSAORH" mutable="false" where="OCHAMND = 0">
    <composite-id>
      <key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
      <key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
      <key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
    </composite-id>

   <many-to-one name="Customer" class="Customer" lazy="proxy" fetch="join">
      <column name="OCHCLII" not-null="true"/>
      <column name="OCHCOSC" not-null="true"/>
    </many-to-one>
  </class>
</hibernate-mapping>

фильтр для клиентов сущностей потерян.
Я где-то читал, что предложение where не работает для ассоциации, и вы должны использовать предложение where для коллекции (bag, set,и т. д.), но как я могу сделать это со многими к одному?

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 26 июля 2011

Как насчет отображения Клиента, использующего дискриминатор с использованием ANFCLI, а затем устанавливающего значение дискриминатора 'Y'. Я думаю, что NHibernate рассмотрит это немного более строго, чем предложение where.

<class name="Customer" table="ANSADID" mutable="false" discriminator-value="Y">
  <composite-id>
    <key-property name="CustomerCode" column="ANCOCO" type="String" length="10" />
    <key-property name="Company" column="ANCOSO" type ="String" length="5" />
  </composite-id>
  <discriminator column="ANFCLI" />
  <property name="Name" column="ANINCO" type="String" length="100" />
</class>
1 голос
/ 26 июля 2011

Я думаю, что дегороллс прав: Вам потребуется суперкласс под названием «Персона» и два подтипа под названием «Клиент» и «Поставщик». Затем вы устанавливаете свое отображение так, чтобы оно использовало поле ANFCLI в качестве дискриминатора со значением Y для Customer и значением N для поставщика. Таким образом, вы получите красивый и прозрачный полиморфизм. (вы сможете делать такие вещи, как «от клиента» или «от поставщика», и это автоматически добавит предложение where).

Надеюсь, это поможет!

0 голосов
/ 25 июля 2011

Я также новичок, использующий NHibernate, но, возможно, вы можете отобразить это отношение (заказ к клиенту), используя сумку (как если бы она была один ко многим)!

...