0

次の問題が NHibernate で別の方法で解決できるかどうか知りたいです。

このドメインがあるとしましょう:

public class A 
{
     public virtual B LastAssociationWithB { get; set; }
     public virtual ICollection<B> CollectionAssociationOfB { get; set; }
}

public class B
{
     public virtual DateTime DateAdded { get; set; }
}

プロパティは、コレクション プロパティに関連付けられた永続オブジェクトのLastAssociationWithB1 つを表します。BCollectionAssociationOfB

実際には、日付によって追加されLastAssociationWithBた最後のB永続オブジェクトを表します。

したがって、ドメインでは、 に新しいBが追加されるとCollectionAssociationOfB、 にも割り当てられLastAssociationWithBます。

これは、後でコードを単純な LINQ クエリに変換するための良い方法です。

とにかく、私の質問は次のとおりです。これに対する他のアプローチを知っていますか? たとえば、内部で SQL結合を生成するある種の多対 1 の関連付けで、テーブルに明示的な 1:n 関係を持たせる必要はありませんが、クラス プロパティは維持されますか?A

または、私の現在のアプローチは、このシナリオを解決するための推奨される方法ですか?

補足: 実際のシナリオでCollectionAssociationOfBは、NHibernate マッピング構成で順序付けが指定されているため、順序付けられたリストです。

4

1 に答える 1

1

式を使用して関係を指定できます。

これが良いかどうかは議論の余地があります..それはあなたの状況に依存します-一方では一貫性を保証しますが、他方ではクエリ時にパフォーマンスが低下する可能性があります-したがって、実際にはあなた自身の特定のケースに依存します.

もう 1 つの方法は、B への挿入時にトリガーを使用して A の列を更新することです。これには、ロジックをデータベースに移動するという欠点がありますが、潜在的なパフォーマンスの低下なしに一貫性を確保できます。

NHibernate イベントを使用して B の保存をインターセプトし、次に A を更新することで、トリガーと同等のものを実現することもできます。ロジックがコードに残っているという利点がありますが、データベースを直接更新すると矛盾が生じる可能性があるという欠点があります。

もちろん、両方のトリガー オプションは、ロジックを実行する A または B のメソッドを持つのとは対照的に、ロジックを多少難読化します。個人的には、おそらく A に新しい B を追加して関連付けを更新するメソッドを配置しますが、その場合、誰も B コレクションを直接更新してメソッドをバイパスしないようにする必要があります。

于 2013-09-23T14:53:40.083 に答える