2011-07-21 39 views
0

私のデータベースにはPersonとウィジェットの間に多対多の関係があります。管理者役割のある人はすべてのウィジェットにアクセスできます。私のアプリケーションでは、1人のウィジェットにアクセスできるウィジェットを確認したい。暗黙的で明示的な関係を持つ多対多

私は2つのハイレベルのオプションがあります。

  1. は、明示的に関係を管理。人が管理者になったら、その人をすべての既存のウィジェットに関連付ける。ウィジェットが作成されると、そのウィジェットを既存のすべての管理者に関連付けます。

  2. 実行時に、Personが管理者の場合は、すべてのウィジェットにアクセスできると仮定し、ウィジェットをロードするときに関係テーブルをバイパスします。

他よりも一つの選択肢より良いですか?このシナリオの名前はありますか?

私はNHibernateを使ってオプション2を適用しようとしていますが、エンティティのすべてのウィジェットをロードするときに関係テーブルをバイパスする方法を見つけることができませんでした(そして、もしできたとしても、 Personエンティティとは別にウィジェットをロードしてページングを適用しない限り多くの情報を読み込みます)。

答えて

1

私はこれをロールでマップします。

役割:人= 1:あなたは人を作成するとき、彼らは既存の管理者ロールを使用した場合には管理者である場合を除き、多くの

だから、あなたはまた、新しい役割を作成します。

問題は簡単です:あなたはWidgetRoleテーブルが必要です。人は、単に彼らの現在の役割を変更するには、管理者ロールに変わったら

新しいウィジェットが作成され

、およびエントリが自動的に、NewWidget用WidgetRoleテーブルへのAdminRole

が追加されます。

imoこの設定は特別な管理者の場合よりも論理的に簡単です。

+0

Person-Widgetは私のコントロールを超えていますが、私はRole-Widget関係を追加し、2つのセットをマージするPersonにプロパティを持たせることができます。NHibernateのトリッキーはなく、将来的には微調整の余地が残っています。 – Mayo

0

私は最終的な解決策を共有する必要がありました。NHがDBに明示的ではない関係をロードするよう助けてくれる人を助けなければなりません。

私はすでに人のサブクラスを作成していたし、NHibernateのは、管理者を認識するのに十分なスマートです:人と人が(管理者がPK/FK PERSONIDを持つテーブルを持っている)管理者

として、私はちょうど追加したことをインスタンス化管理者のための新しいマッピングオーバーライド...

mapping.HasManyToMany(x => x.Widgets) 
    .Table("AdministratorWidgetAccess") 
    .Cascade.None(); 

そして、私はAdministratorWidgetAccessというビューを追加...

SELECT a.PersonId as [AdministratorId], w.WidgetId as 
FROM dbo.Administrator AS a LEFT OUTER JOIN 
    dbo.Widget AS w ON 1 = 1 

実行時にPersonが管理者の場合、ビュー内の関係に基づいてすべてのウィジェットがロードされます。そうでない場合は、ジョイン・テーブルに基づいてウィジェットがロードされます。