1

2 つの既存のテーブル(User: UserId, Name)(Location: LocationId, Name)の間に多対多の関係がありますが、これらは変更できません。多対多のマッピングを使用しましたが、履歴/将来の動きを含めるという新しい要件があります。

最初の 3 つのフィールドが主キーを構成する古いテーブルを置き換える新しい交差テーブル(UserLocation: UserId、LocationId、EffectiveDate、Status)のレコードを効果的にデートするという peoplesoft の概念を使用しました。

SQL では、次のステートメントを使用して、特定の発効日のアクティブなレコードを返すことができますが、NHibernate からこのようなものを取得することはできません (複数レベルの選択でパラメーターが機能していないというエラーが表示されることさえあります)。

select l.*  
from location l  
where l.locationId in  
  (select ul.locationId  
   from UserLocation ul  
   where (ul.EffectiveDate =   
     (select max(ul_ed.EffectiveDate)  
      from UserLocation ul_ed  
      where ul.LocationId = ul_ed.LocationId  
        and ul.EffectiveDate = ul_ed.EffectiveDate  
        and ul.UserId - ul_ed.UserId  
        and ul.Status = true))  

UserId 列と EffectiveDate 列のパラメーターを含めて、さらにフィルター処理されたレコードを返す必要がありますが、最初からすべてを返すことができれば幸いです。

ただし、私の問題はマッピングクラスであり(流暢ではなくコードマッピングを使用しています)、動作に近づけることさえできません(NHibernateの知識が限られています)。交差テーブル用の新しいクラスを作成する必要がないことを望んでいました。選択を機能させることさえできないため、挿入/更新/削除の部分にまだ到達していません。

要件: 1. ユーザーをEffectiveDate = NOW、Status = Trueの場所に関連付けるときは、UserLocationに新しいレコードを挿入します。 3. ユーザーを新しい場所に移動すると、EffectiveDate = NOW、Status = TrueのUserLocationに新しいレコードを挿入する必要があります。ロケーションのユーザーは、EffectiveDate = NOW、Status = False の新しい UserLocation レコードを挿入します。 5. ユーザーが特定の日付に関連付けられているロケーションを取得します。

注: このデータに基づいてレポートが生成されるため、記録を削除することはできません。また、将来のイベントのためにデータも作成されます。

誰かが私を正しい方向に向けて始めることができれば、それはありがたいです. Loader クラスと Interceptor クラスを見てきましたが、適合しないようです。

4

2 に答える 2

0

これは、説明したシナリオで機能する、私たちが思いついた答えです。

Filter("EffectiveDate", mm => mm.Condition("Status = 1 and EffectiveDate = (select max(t1.EffectiveDate) from Table1 t1 where t1.Id = Id and t1.EffectiveDate <= :effectiveDate)"));

フィルタはテーブルとマッピングに適用できます。ただし、複雑さを軽減するために、2 つのテーブルを 1 つのテーブルに結合することになりました。

注: マッピングで使用する前に、フィルターを定義してセッションに適用する必要があります。完全な詳細については、十分に文書化された nHibernate doco を参照してください。

于 2012-10-02T06:20:42.983 に答える