0

これら2つのクラス間の関係を検討してください

public class Order
{
  public int OrderId {get;set;}
  public int CustomerId {get;set;}  // Should this be here?
  public Customer Customer{get;set}
}

public class Customer
{
  public int CustomerId {get;set;}
  public string Name {get;set;}
}

OrderでCustomerIdプロパティが必要ないことを理解し、それが最も美しいOOの方法ではないことに同意します。Customerプロパティしかないので、Order.Customer.CustomerIdに顧客のIDを取得するように簡単に要求できます。

しかしその場合、NHibernateはその顧客をロードするためにデータベースへのリクエストをトリガーし、注文のCustomerIdが必要な場合がいくつかあります(実際には多くの場合)。この場合、 OrderクラスのCustomerIdは有用であり、データベースへのアクセスが少なくて済みます。(私がこれについて間違っている場合は、私を訂正してください)。

質問1:両方のプロパティを常に更新するようにNHibernateに伝える方法はありますか?

プロパティCustomerIdには常にCustomerのIDがあり、プロパティCustomerは、必要な場合にのみlazyによってロードされます(たとえば、顧客の名前を取得する場合)。MicrosoftEntityFrameworkはこれを可能にします。

質問2:それが不可能な場合、私はこれについて心配する必要がありますか?

アップデート

回答の指示に従って、(私の場合)NHibernateが期待どおりに機能しなかった理由を確認するためのテストを行い、興味深いものを見つけました。Accessorを使用しない場合、NHibernateはデフォルトでOrder.Customer.CustomerIdでデータベースにアクセスしません。 CustomerIdプロパティのフィールドマッピング。

デフォルトのアクセサーでは、期待どおりに機能します。なぜですか?

4

2 に答える 2

4

NHibernateのデフォルトの動作は、IDにのみアクセスするときにオブジェクトをロードしないことです。私が以下に引用した別の質問がすでにここでこれに答えています。

データベースから取得する場合、これにAアクセスしてもデータベースA.B.Idにはヒットしません。Idフィールド以外のプロパティにアクセスすると、NHibernateはデータベースからBを取得します。

したがって、要約すると、呼び出しを行ってOrder.Customer.CustomerIdもNHibernateがDBにcustomerテーブルの行を照会することはありません。CustomerIdしたがって、OrderクラスからCustomerIDを削除することをお勧めします。

于 2013-03-19T21:13:46.693 に答える
1

書き込み可能なプロパティは1つだけです。このように両方をマッピングすることをお勧めします(このアプローチを使用しています):

クラス

public int CustomerId {get;set;}  // Should this be here?
public Customer Customer{get;set} // Answer: yes

マッピング

<many-to-one name="Customer" column="CustomerId"  />
<property  name="CustomerId" column="CustomerId" insert="false" update="false" />

これで、読み取り操作の両方のプロパティを同じ方法で操作できます(フィルタリングなど)。切り離された注文の入札は、読み取り専用Customerである間、を設定する必要があります。CustomerId

したがって、書き込み操作では、1つのプロパティのみを使用できます(使用する必要があります)。

利点は、顧客 のみでフィルタリングする必要がある場合ID、顧客(オブジェクト、テーブル)をまったく操作する必要がないことです。

于 2013-03-20T04:39:03.150 に答える