Domanda

Sto lavorando su un database legacy che è abbastanza intricata.
I clienti della tabella è condivisa con i fornitori e che ha creato questo struttura utilizzata una bandiera per identificare i clienti. Dato che io sono solo interessati a lavorare con i record definiti come i clienti Ho aggiunto una clausola in cui al mio mappatura:

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

Come si può vedere che ho precedentemente filtrati tutti i miei clienti con questa clausola: ANFCLI = 'Y' Tutto funziona perfettamente bene se I clienti di query (la clausola in cui viene utilizzato):

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

Ma se interrogo la tabella degli ordini - in cui ho una relazione molti-a-uno:

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

il filtro sui clienti entità è perduto.
Stavo leggendo da qualche parte che la clausola in cui non funziona su un'associazione e si deve utilizzare una clausola in cui sulla raccolta (sacchetto, insieme, etc etc), ma, come posso farlo con una relazione molti-a-uno?

Grazie per l'aiuto.

È stato utile?

Soluzione

Che dire di mappatura dei clienti utilizzando un discriminatore utilizzando ANFCLI e quindi impostare il valore discriminatore a 'Y'. Credo che NHibernate tratterà questo un po 'più rigorosamente di una clausola 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>

Altri suggerimenti

Credo degorolls ha ragione: Si avrebbe bisogno di avere una classe super-chiamato "persona", e due sottotipi chiamato "Cliente" e "fornitore". Quindi si imposta la mappatura in modo che utilizza il campo ANFCLI come discriminatore, con il valore Y per il Cliente e il valore di N per fornitore. In questo modo, avrete una bella e il polimorfismo trasparente. (Sarete in grado di fare cose come "da parte del Cliente", o "da fornitore", e che vi automagicaly aggiungere la clausola dove).

Speranza che aiuta!

Sono anche un principiante utilizzando NHibernate, ma forse è possibile mappare quel rapporto (Ordine di clienti) utilizzando un sacco (come se fosse uno a molti)!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top