0

私は非常に複雑なレガシーデータベースに取り組んでいます。
テーブルcustomersはサプライヤと共有され、この構造を作成した人はフラグを使用して顧客を識別しました。顧客として定義されたレコードの操作にのみ関心があるため、マッピングに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();

しかし、注文テーブルをクエリすると、多対1の関連付けがあります。

<?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句が関連付けで機能せず、コレクション(bag、setなど)でwhere句を使用する必要があることをどこかで読んでいましたが、多対1でそれを行うにはどうすればよいですか?

助けてくれてありがとう。

4

3 に答える 3

1

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>
于 2011-07-25T23:34:03.223 に答える
1

デゴロールは正しいと思います。「Person」というスーパークラスと、「Customer」と「Supplier」という2つのサブタイプが必要です。次に、マッピングを設定して、ANFCLIフィールドを識別子として使用し、Y値をCustomerに、N値をSupplierに使用します。このようにして、素晴らしく透明なポリモーフィズムが得られます。(「顧客から」や「サプライヤーから」などの操作を実行できるようになり、自動的にwhere句が追加されます)。

お役に立てば幸いです。

于 2011-07-26T13:45:01.167 に答える
0

私もNHibernateを使用する初心者ですが、おそらくバッグを使用してその関係(顧客への注文)をマッピングできます(1対多のように)!

于 2011-07-25T16:15:30.360 に答える